我正在使用带有Capistrano部署的Bedrock
当我使用命令bundle exec cap staging deploy:check
时,我收到了身份验证错误:
...
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中删除了所有指令,因此我可以使用me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'
之类的命令。
如果我输入命令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
答案 0 :(得分:6)
好的,所以我遇到了同样的问题,我花了很长时间才弄清楚到底发生了什么,结果就是 -
我认为这不会改变,至少暂时不会改变。
代理转发
有关代理转发的更多信息,请参阅An Illustrated Guide to SSH Agent Forwarding,以及关键挑战如何在我们的工作站上重新开始。
<强>术语强>
工作站 - 我们的SSH机器(Windowa服务器/台式机/笔记本电脑) 客户端软件正在运行,最重要的是,我们的PKI 私钥存储在(有或没有密码)
部署节点 - 我们的Capistrano部署任务的目标,大多数 像“服务器”中定义的那样键入我们的config / deploy.rb,或 config / deploy / .rb文件
git repo - 我们将从中提取代码,首先通过&#34; git查询 LS-远程&#34; - 我们将通过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仓库拉到我们的部署节点。
现在我们可以通过在部署节点上设置公共SSH密钥并使用OpenSSH ssh客户端来确认我们有无密码的ssh工作来测试这一切。然后我们可以通过
设置ssh-agent如果一切都设置正确,这一切都会有效,所以我们会认为&#34;好吧我可以进行一次上限部署:检查&#39;&#34; - 它将失败。
错在哪里
我们会收到错误
&#34;从身份验证套接字&#34;
读取响应长度时出错谁在告诉我们这件事?它不是立即清楚,但它
不是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机器上进行过实验。