Capistrano失败,因为它无法连接到远程git存储库

时间:2017-11-18 21:14:51

标签: ruby-on-rails ssh capistrano

我正在尝试使用Capistrano 3.x进行部署。

我在〜/ .ssh / config 文件中配置了代理转发:

Host git-codecommit.*.amazonaws.com
  Hostname xxxx
  ForwardAgent yes
  IdentityFile /path/to/codecommit_rsa

我对ForwardAgent yes的服务器连接做了同样的事情。

我验证了我的服务器允许在 / etc / ssh / sshd_config 文件中转发代理:

AllowAgentForwarding yes
  INFO ----------------------------------------------------------------
  INFO START 2017-11-18 16:09:44 -0500 cap production deploy
  INFO ---------------------------------------------------------------------------
  INFO [b43ed70f] Running /usr/bin/env mkdir -p /tmp as deploy@50.116.2.15
 DEBUG [b43ed70f] Command: /usr/bin/env mkdir -p /tmp
  INFO [b43ed70f] Finished in 1.132 seconds with exit status 0 (successful).
 DEBUG Uploading /tmp/git-ssh-testapp-production-blankman.sh 0.0%
  INFO Uploading /tmp/git-ssh-testapp-production-blankman.sh 100.0%
  INFO [b1a90dc1] Running /usr/bin/env chmod 700 /tmp/git-ssh-testapp-production-blankman.sh as deploy@50.116.2.15
 DEBUG [b1a90dc1] Command: /usr/bin/env chmod 700 /tmp/git-ssh-testapp-production-blankman.sh
  INFO [b1a90dc1] Finished in 0.265 seconds with exit status 0 (successful).
  INFO [b323707d] Running /usr/bin/env git ls-remote ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/fuweb HEAD as deploy@50.116.2.15
 DEBUG [b323707d] Command: ( export GIT_ASKPASS="/bin/echo" GIT_SSH="/tmp/git-ssh-testapp-production-blankman.sh" ; /usr/bin/env git ls-remote ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/fuweb HEAD )
 DEBUG [b323707d]   Permission denied (publickey).
 DEBUG [b323707d]   fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

正如评论中所讨论的,SSH代理必须在远程服务器以及包含密钥的本地计算机上运行,​​因为每端的代理需要合作转发密钥信息。代理(ssh-agent)与SSH服务器(sshd)不同。服务器接受连接,而(否则是可选的)代理管理凭证。

某些系统在登录时自动启动代理。要检查是否是这种情况,请登录服务器并运行:

$ env | grep SSH

...寻找SSH_AGENT_PIDSSH_AGENT_SOCK等变量。如果未启动,我们可以执行以下命令在服务器上启动代理:

$ eval "$(ssh-agent)"

正如我们所看到的,这个评估 ssh-agent命令的输出,因为ssh-agent返回一个脚本,在会话中设置一些所需的环境变量。

我们需要确保代理在登录时自动启动,以便它不会干扰部署过程。如果我们检查并确定代理,实际上,从登录开始,我们可以将最后一个命令添加到“deploy”用户的〜/ .profile 文件中(或〜/ .bash_profile )。

另请注意,本地〜/ .ssh / config 中指定的主机必须与我们要将凭据转发到的主机的名称或IP地址匹配,不是最终使用转发密钥进行身份验证的主机。我们需要改变:

Host git-codecommit.*.amazonaws.com

......来:

Host 50.116.2.15

我们可以通过检查详细输出来验证SSH客户端是否执行代理转发:

$ ssh -v deploy@50.116.2.15
...
debug1: Requesting authentication agent forwarding.
...

当然,请务必使用ssh-add向本地座席注册任何所需的密钥(这也可以在登录时自动完成,如上所示)。我们可以随时检查代理加载的密钥:

$ ssh-add -l

答案 1 :(得分:1)

您需要让Capistrano知道您希望它转发您的本地密钥。这可以通过进入项目的config/deploy.rb并添加以下行来完成:

ssh_options[:forward_agent] = true

IIRC,Capistrano通过SSHKit远程执行命令,因此即使您调用ssh-agent并在本地添加密钥,我也不能说它是否会持续存在于下一个命令中。