Capistrano 和几个 SSH 密钥

Posted

技术标签:

【中文标题】Capistrano 和几个 SSH 密钥【英文标题】:Capistrano and several SSH keys 【发布时间】:2011-11-01 12:30:29 【问题描述】:

我需要 Capistrano 使用 2 个不同的 SSH 密钥。一个用于 git 存储库,一个用于部署到的服务器。

我在 .ssh 文件夹中将哪个键重命名为 id_rsa 都可以。另一个没有。如果我将 git 密钥重命名为 id_rsa,Capistrano 可以连接到 git 存储库,但无法在要部署的服务器上进行身份验证。如果我称它为其他名称,它将无法连接到 git repo。我知道其他密钥有效,因为我可以执行 ssh -i ~/.ssh/otherKey.pem 并且它会成功连接到服务器。

这就是我的 deploy.rb Capistrano 文件中的内容。

ssh_options[:keys] = [
        File.join(ENV["HOME"], ".ssh", "id_rsa"),
        File.join(ENV["HOME"], ".ssh", "deploy")
    ]

ssh_options[:forward_agent] = true 

如何让 Capistrano 使用这两个键?它似乎只使用了一个叫做 id_rsa 的。

编辑:

这是 Capistrano 的输出,带有错误消息:

$ cap yii deploy
  * executing `yii'
Yii
  * executing `deploy'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
    executing locally: "git ls-remote git@project.beanstalkapp.com:/projectyii.git HEAD"
  * executing "git clone -q git@project.beanstalkapp.com:/projectyii.git /var/www/projectyii-trunk/releases/20110824174629 && cd /var/www/projectyii-trunk/releases/20110824174629 && git checkout -q -b deploy 5e14521285ca04a605353e97bdf31c3a2889dbfb && (echo 5e14521285ca04a605353e97bdf31c3a2889dbfb > /var/www/projectyii-trunk/releases/20110824174629/REVISION)"
    servers: ["yii.project.com"]
    [yii.project.com] executing command
 ** [yii.project.com :: err] Error reading response length from authentication socket.
 ** [yii.project.com :: err] Permission denied (publickey,keyboard-interactive).
 ** [yii.project.com :: err] fatal: The remote end hung up unexpectedly
    command finished
*** [deploy:update_code] rolling back
  * executing "rm -rf /var/www/projectyii-trunk/releases/20110824174629; true"
    servers: ["yii.project.com"]
    [yii.project.com] executing command
    command finished
failed: "sh -c \"git clone -q git@project.beanstalkapp.com:/projectyii.git /var/www/projectyii-trunk/releases/20110824174629 && cd /var/www/projectyii-trunk/releases/20110824174629 && git checkout -q -b deploy 5e14521285ca04a605353e97bdf31c3a2889dbfb && (echo 5e14521285ca04a605353e97bdf31c3a2889dbfb > /var/www/projectyii-trunk/releases/20110824174629/REVISION)\"" on yii.project.com

编辑:

另一件事:它在我的本地机器上完全可以正常工作,只是不在部署服务器上 - 使用完全相同的配置文件! Capistrano 似乎在我的本地机器上使用了正确的密钥,但在部署机器上却没有。

【问题讨论】:

你解决过这个问题吗?我也有同样的。 【参考方案1】:

免责声明:我对 Capistrano 一无所知。

如果它只是进行正常的ssh 调用(或调用git 来执行此操作),您可以在每个主机(或每个主机别名)的基础上配置正确的密钥以在您的~/.ssh/config 中使用.

例如,我的~/.ssh/config 文件中有这些行:

# Git bei Github
Host github.com
User git
IdentityFile ~/.ssh/svn_id_rsa

#  Andere Mathe-Hosts
Host *.math.hu-berlin.de
User ebermann
IdentityFile ~/.ssh/id_rsa
ControlMaster auto

【讨论】:

嗨,谢谢你的想法。我将其设置为“ssh deploy.server.com”直接连接到部署服务器。但是,Capistrano 仍然无法对 deploy.server.com 进行身份验证——它实际上是同一个 URL。 :-( 还有其他想法吗? 会不会是 Capistrano 以某种方式设置了错误的用户名?在命令行上给 SSH 的用户名会覆盖配置文件中的用户名。除此之外,显示错误消息(如果有的话),也许任何调试输出可能会有所帮助。 这是可能的,那将是哪个用户名/我如何测试它?我用 set :user 设置了用户名,它应该是正确的。但是,即使我将其注释掉,它也不起作用。我将整个 Cap 输出添加到原始问题中。【参考方案2】:

我在 deploy.rb 中有这一行:

ssh_options[:keys] = %w(/Users/victor.pudeyev/ec2/MBP-2.pem)

这表明关键文件名是空格分隔的,例如

ssh_options[:keys] = %w(/Users/victor.pudeyev/ec2/MBP-1.pem /Users/victor.pudeyev/ec2/MBP-2.pem)

【讨论】:

%w(...) 创建一个带有空格分隔标记的字符串数组,所以这不是问题 未定义的局部变量或方法 `ssh_options' ,可能在较新版本中已更改【参考方案3】:

我遇到了这个问题,并且在 capfile 中设置了 ssh 转发。删除它,允许目标框使用自己的键

【讨论】:

【参考方案4】:

在这里聚会有点晚了,但一种选择是使用一点红宝石胶来检测要使用的文件:

['~/.ssh/onekey.pem','~/.ssh/id_rsa'].each do |name|
  if File.exists?(File.expand_path(name))
    ssh_options[:keys] ||= name
  end
end

【讨论】:

以上是关于Capistrano 和几个 SSH 密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何在通过 Capistrano 部署 Rails 应用程序时输入 ssh 密钥的密码?

Rails 5.1 Capistrano 使用 secrets.yml.key 部署

Rails 4 + Capistrano + AWS Net::SSH::AuthenticationFailed: 部署

AWS ElasticBeanstalk、CodeDeploy 与 Capistrano、Mina、Vlad 等

Capistrano 3 部署要求输入 SSH 密码,但无法输入

SSH 代理转发不起作用