尽管有SSH密钥,Capistrano在部署时会要求输入密码

时间:2010-07-16 23:55:51

标签: ruby-on-rails ruby sinatra capistrano ssh-keys

我的ssh密钥肯定是正确设置的,因为在使用ssh时我从未提示输入密码。但是在使用cap deploy进行部署时,capistrano仍然要求输入密码。我设置cap deploy:setup时不会要求输入密码,但奇怪的是。如果没有密码提示,它将使部署周期更加顺畅。

细节:我正在将一个Sinatra应用程序部署到Dreamhost共享帐户(使用Passenger)。我曾经按照教程做了很长时间,当时完美无缺。从那以后出现了什么。我正在使用capistrano(2.5.9)和git版本1.6.1.1。这是我的Capfile:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator

set :user, 'ehsanul'
set :domain, 'jellly.com'

default_run_options[:pty] = true

# the rest should be good
set :repository,  "ehsanul@jellly.com:git/jellly.git"
set :deploy_to, "/home/ehsanul/jellly.com"
set :deploy_via, :remote_cache
set :scm, 'git'
set :branch, 'deploy'
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_sudo, false

server domain, :app, :web

namespace :deploy do
  task :migrate do
    run "cd #{current_path}; /usr/bin/rake migrate environment=production"
  end
  task :restart do
    run "touch #{current_path}/tmp/restart.txt"
  end
end

after "deploy", "deploy:migrate"

以下是我cap deploy发生的事情的输出,直至密码提示:

$ cap deploy
  * executing `deploy'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
    updating the cached checkout on all servers
    executing locally: "git ls-remote ehsanul@jellly.com:git/jellly.git deploy"
/usr/local/bin/git
  * executing "if [ -d /home/ehsanul/jellly.com/shared/cached-copy ]; then cd /home/ehsanul/jellly.com/shared/cached-copy && git fetch  origin && git reset  --hard ea744c77b0b939d5355ba2dc50ef1ec85f918d66 && git clean  -d -x -f; else git clone  --depth 1 ehsanul@jellly.com:git/jellly.git /home/ehsanul/jellly.com/shared/cached-copy && cd /home/ehsanul/jellly.com/shared/cached-copy && git checkout  -b deploy ea744c77b0b939d5355ba2dc50ef1ec85f918d66; fi"
    servers: ["jellly.com"]
    [jellly.com] executing command
 ** [jellly.com :: out] ehsanul@jellly.com's password:
Password:
 ** [jellly.com :: out]
 ** [jellly.com :: out] remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.

什么可以被打破?

7 个答案:

答案 0 :(得分:64)

在我的本地计算机上执行ssh-add ~/.ssh/id_rsa为我解决了问题。在使用Capistrano调用时,似乎ssh命令行工具没有检测到我的身份。

答案 1 :(得分:53)

密码提示是因为您要部署的服务器正在连接到git服务器并需要身份验证。由于您的本地计算机(从部署)已经具有有效的ssh-key,因此请在Capfile中启用转发来使用该计划:

set :ssh_options, {:forward_agent => true}

当部署服务器尝试连接到您的git服务器时,它会从本地计算机转发身份验证。

将您的私钥放在部署服务器上更为可取!

当服务器重新启动时,另一种绕过密码提示的方法是告诉capistrano不要这样做。感谢Daniel Quimper的capistrano-site5 github回购的“自述”部分,我们注意到以下内容:

set :deploy_via, :copy

显然,这适用于app和git存储库都托管在同一主机上的情况。但我想我们中的一些人正在这样做:)

答案 2 :(得分:17)

我遇到了同样的问题。

这条线没有用:

set :ssh_options, {:forward_agent => true}

然后我在Dreamhost wiki上提到了执行

[local ~]$ eval `ssh-agent`
[local ~]$ ssh-add ~/.ssh/yourpublickey  # omit path if using default keyname

现在我可以在没有密码的情况下部署。

答案 3 :(得分:3)

日志显示在通过SSH登录到jellly.com后提示输入密码,因此看起来实际的git更新提示输入密码。

我认为这是因为您的存储库设置指定了您的git用户,即使您可以在这种情况下匿名访问它。

您应该创建一个匿名git帐户并更改您的repo行,如下所示:

set :repository,  "git@jellly.com:git/jellly.git"

或者,您可以将SSH密钥放在生产服务器上,但这听起来并不有用。您还可以配置SSH以通过初始SSH连接转发身份验证请求。但是,用于部署的匿名只读源代码控制可能更容易。

答案 4 :(得分:1)

我将我的本地machie id_rsa.pub密钥复制并粘贴到远程服务器的authorized_key文件中并且有效

答案 5 :(得分:0)

如果您使用的是Windows工作站(便携式),有时可以直接连接到内部企业网络,有时通过VPN连接,您可能会发现在运行上限远程任务时要求您输入密码的行为不一致。 / p>

在我的情况下,我们公司的登录脚本在您登录时执行,同时已连接到将HOME目录设置为网络共享位置的公司LAN。如果您从缓存凭据登录然后登录VPN,则登录脚本不会设置您的主目录。存储私钥的.ssh目录可能只位于其中一个位置。

在这种情况下,一个简单的解决办法就是将.ssh目录从拥有它的HOME复制到不具有它的HOME。

答案 6 :(得分:0)

手动将公钥复制到authorized_keys在我的情况下不起作用,但通过服务工作,当我发现服务只是在最后添加了一个相同的密钥

ssh-copy-id ~/.ssh/id_rsa.pub user@remote