【问题标题】:Capistrano is failing because it cannot connect to remote git repositoryCapistrano 失败,因为它无法连接到远程 git 存储库
【发布时间】:2017-11-18 21:14:50
【问题描述】:

我正在尝试使用 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.

我在这里错过了什么?

【问题讨论】:

  • 如果我错了,请纠正我:看起来部署过程已成功连接到您的服务器,但无法通过 CodeCommit 进行身份验证。您是否已经为 CodeCommit add your public key to the IAM user
  • @CyRossignol 是的,在我的笔记本电脑上,我可以很好地连接到代码提交。
  • 您是否在本地和远程服务器上都启动了 SSH 代理进程,并在本地机器上启动了 ssh-add 密钥?并不是要让您厌烦这些基础知识,但我不能仅通过查看问题来假设这些先决条件:)
  • @CyRossignol 是的,我做了 ssh-add。如何在远程服务器上启动它以及如何检查它是否正在运行?实际上它必须正在运行,因为我可以 'ssh deploy@1.1.1.1 并且我可以很好地进入远程服务器。
  • 代理 (ssh-agent) 与 SSH 服务器 (sshd) 不同。服务器接受连接,而(可选)代理管理凭据。登录服务器后,我们可以运行env | grep SSH来判断代理是否在运行。寻找像SSH_AGENT_PIDSSH_AGENT_SOCK 这样的变量。有些系统会在登录时自动启动代理。如果没有启动,我们可以使用eval "$(ssh-agent)"在服务器上启动代理。

标签: ruby-on-rails ssh capistrano


【解决方案1】:

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

ssh_options[:forward_agent] = true

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

【讨论】:

【解决方案2】:

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

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

$ env | grep SSH

...寻找像SSH_AGENT_PIDSSH_AGENT_SOCK 这样的变量。如果没有启动,我们可以执行以下命令在服务器上启动代理:

$ eval "$(ssh-agent)"

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

我们需要确保代理在登录时自动启动,以免干扰部署过程。如果我们检查并确定代理确实 not,实际上是在登录时启动,我们可以将最后一条命令添加到“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

【讨论】:

    【解决方案3】:

    这通常对我有帮助:

    ssh-add -D   
    ssh-agent    
    ssh-add      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多