加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Capistrano错误:无法连接到ssh-agent

发布时间:2020-12-17 03:18:06 所属栏目:百科 来源:网络整理
导读:我正在使用带有Capistrano部署的Bedrock. 当我使用命令包exec cap staging deploy时:检查我收到了身份验证错误: ...D,[2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.session[1e34a58]: trying publickeyD,[2015-05-09T15:39:53.87
我正在使用带有Capistrano部署的Bedrock.
当我使用命令包exec cap staging deploy时:检查我收到了身份验证错误:

...
D,[2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.session[1e34a58]: trying publickey
D,[2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.agent[1e30d2c]: connecting to ssh-agent
E,[2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.agent[1e30d2c]: could not connect to ssh-agent
E,[2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.session[1e34a58]: all authorization methods failed (tried publickey)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@SERVER_IP: Authentication failed for user deploy@SERVER_IP
Tasks: TOP => git:check => git:wrapper

Capistrano无法连接到我的服务器上的ssh-agent.

但是我可以通过SSH登录我的服务器,就像没有密码的ssh deploy @ SERVER_IP一样.我在Capistrano Authentication & Authorisation Docs page中删除了所有指令,因此我可以使用像@ localhost $ssh deploy@one-of-my-servers.com’主机名这样的命令;正常运行时间”.
如果我输入命令ssh -A deploy @ SERVER_IP’env | grep SSH_AUTH_SOCK’我得到了结果

SSH_AUTH_SOCK=/tmp/ssh-UweQkw7578/agent.7578

这是我的deploy.rb文件:

set :application,'dyxovka-special'
set :repo_url,'git@github.com:tanzoor/dyxovka-wp-theme.git'
set :branch,:master
set :tmp_dir,'~/tmp'
set :log_level,:info
set :linked_files,fetch(:linked_files,[]).push('.env')
set :linked_dirs,fetch(:linked_dirs,[]).push('web/app/uploads')

这是我的staging.rb文件:

set :stage,:staging
set :deploy_to,-> { "/var/www/vhosts/project/dev" }
server 'SERVER_IP',user: 'deploy',roles: %w{web app}
set :ssh_options,{
  user: 'deploy',keys: %w('/c/Users/alexander/.ssh/id_rsa'),forward_agent: true,auth_methods: %w(publickey),verbose: :debug
}
fetch(:default_env).merge!(wp_env: :staging)

在sshd_config文件中启用了Apache的代理转发代理指令:AllowAgentForwarding yes

我的配置文件应该如何使我的部署工作?

Windows 8.1
Ruby 2.2.0
Capistrano 3.2.1
Git Bash

解决方法

好的,所以我遇到了同样的问题,我花了很长时间才弄清楚到底发生了什么,结果是 –

>对于Windows上的ruby,你必须运行pagent而不是ssh-agent,以便Capistrano和代理转发工作 – 实际上几乎任何在Windows上使用Ruby net-ssh库的工具.

而且我认为这不会改变,至少暂时不会改变.

代理转发

有关代理转发的更多信息,请参阅An Illustrated Guide to SSH Agent Forwarding,以及关键挑战如何在我们的工作站上进行备份.

术语

>工作站 – 我们的SSH机器(Windowa服务器/台式机/笔记本电脑)
客户端软件正在运行,最重要的是,我们的PKI
私钥存储在(带或不带密码)
>部署节点 – 我们Capistrano部署任务的目标,大多数
就像我们的config / deploy.rb中的’server’键中定义的一样,或者
config / deploy / .rb文件
> git repo – 我们将从中提取代码,首先通过“git”查询
ls-remote“ – 我们将通过SSH和部署访问这个git repo
节点将使用代理转发将密钥质询传递回
工作站
> SSH客户端软件 – 我们如何在远程服务器上与sshd联系,以及
可以访问我们的私钥.可能是putty,一个OpenSSH ssh
客户端或Ruby中的net-ssh库.

建立

我有一个带有Git-Bash的Windows 7工作站盒,以及它的OpenSSH ssh客户端,以及来自Joe Reagle的脚本,它设置了一些环境变量,说明ssh-agent正在运行哪个端口和pid.

我也有Putty和Pageant,但最初我只专注于OpenSSH / Git-Bash工具.

我已经设置了从工作站到部署节点的无密码ssh,我运行了ssh-agent,我通过ssh-add添加了我的密钥,并且我将我的公钥注册为git repo的只读访问密钥.

基本

所以我们尝试使用SSH代理转发让Capistrano从我们的Git repo拉到我们的部署节点上.

现在我们可以通过在部署节点上设置公共SSH密钥并使用OpenSSH ssh客户端来确认我们有无密码ssh工作来测试这一切.然后我们可以设置ssh-agent

>启动ssh-agent并根据需要设置SSH_AUTH_SOCK和SSH_AGENT_PID.
>通过ssh-add将我们的私钥添加到ssh-agent
>将我们的公钥添加为git仓库的授权密钥
> ssh到部署节点,并从那里做一个“git ls-remote git @”(或ssh -T git @)

如果一切都设置正确,这一切都会有效,所以我们会认为“好吧我可以做’帽子部署:检查’” – 它会失败.

什么地方出了错

我们会收到错误

“从身份验证套接字读取响应长度出错”

谁告诉我们这个?它不是立即清楚,但它

>不是git repo
>它不是部署节点上的git客户端
>它不是部署节点上的sshd守护程序,它希望将密钥质询传递回工作站.

它是工作站上的Ruby ssh客户端库.

我们怎么知道呢

在deploy.rb文件的ssh_options哈希中,我们添加以下内容:
??详细:: debug

当我们这样做时,我们会看到此消息

>选美没有跑.

为什么Capistrano尝试使用Pageant而不是ssh-agent

当通过Capistrano运行时,ssh客户端与您手动验证时使用的客户端不同.

在手动验证时,它是一个OpenSSH ssh客户端.现在它是Ruby中的net-ssh库.

在Windows上,net-ssh有这些行

if Net::SSH::Authentication::PLATFORM == :win32
  require 'net/ssh/authentication/pageant'
end

要么

case Net::SSH::Authentication::PLATFORM
when :java_win32
  require 'net/ssh/authentication/agent/java_pageant'
else
  require 'net/ssh/authentication/agent/socket'

所以加载选美会被硬编码到net-ssh中.它甚至没有尝试查看你是否在类似unix的shell(如git-bash或cygwin)下运行,然后使用unix-domain ssh-agent SSH_AUTH_SOCK

目前net-ssh并没有尝试打开一个名为socket的unix域.从理论上讲,我认为它可以通过stdlib中的UNIXSocket类实现.但我还没有在Windows机器上进行过实验.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读