Capistrano和几个SSH密钥

26
我需要让Capistrano使用两个不同的SSH密钥。一个用于git仓库,另一个用于部署到服务器上。
我将其中一个重命名为.ssh文件夹中的id_rsa,它就能工作了。另一个则不能。如果我将git密钥重命名为id_rsa,Capistrano可以连接到git仓库,但无法在服务器上进行身份验证以进行部署。如果我将其命名为其他名称,则无法连接到git仓库。我知道另一个密钥可行,因为我可以使用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 在我的本地机器上使用了正确的密钥,但在部署机器上没有使用。


你解决了这个问题吗?我也遇到了同样的问题。 - Stephen Burke
4个回答

29

免责声明:我对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

2
嗨,谢谢你的建议。我已经设置好了,让'ssh deploy.server.com'直接连接到部署服务器。但是,Capistrano在对deploy.server.com进行身份验证时仍然失败了 - 它实际上是相同的URL。 :-( 有其他的想法吗? - MrB
Capistrano 是否可能设置了错误的用户名?在命令行上给 SSH 指定的用户名会覆盖配置文件中的用户名。除此之外,显示错误消息(如果有的话)和任何调试输出可能会有所帮助。 - Paŭlo Ebermann
这是可能的,那将是哪个用户名/我该如何测试它?我使用 set :user 设置了用户名,应该没问题。但即使我将其注释掉,它也不起作用。我已经将整个 Cap 输出添加到原始问题中。 - MrB

11

我在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)

1
%w(...) 创建一个字符串数组,其中包含以空格分隔的标记,因此这不可能是问题。 - Emirikol
1
未定义本地变量或方法 `ssh_options',可能在更新版本中已更改。 - Zia Ul Rehman Mughal

1
有点晚了,但是一个选项是使用一些 Ruby 粘合剂来检测要使用哪个文件:
['~/.ssh/onekey.pem','~/.ssh/id_rsa'].each do |name|
  if File.exists?(File.expand_path(name))
    ssh_options[:keys] ||= name
  end
end

1

我曾经遇到过这个问题,并在capfile中设置了ssh转发。删除它后,目标主机可以使用自己的密钥。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接