无论SSH密钥如何,Capistrano都要求在部署时input密码

我的SSH密钥无疑是正确设置的,因为我从来没有提示input密码时使用SSH。 但是,capistrano在部署cap deploy时仍然要求input密码。 当我使用cap deploy:setup时,它不要求input密码cap deploy:setup尽pipe如此,奇怪的是, 如果没有密码提示,这会使部署周期更加顺畅。

细节:我正在将一个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. 

什么可能被打破?

密码提示是因为您正在部署的服务器正在连接到git服务器并需要身份validation。 由于您的本地计算机(您从中部署的位置 )已经具有有效的ssh密钥,因此可以通过在Capfile中启用转发来使用该密钥:

 set :ssh_options, {:forward_agent => true} 

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

这比将您的私钥放在部署服务器上更受欢迎!

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

 set :deploy_via, :copy 

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

在我的本地机器执行ssh-add ~/.ssh/id_rsa解决了我的问题。 看起来ssh命令行工具在用Capistrano调用时没有检测到我的身份。

我有同样的问题。

这条线没有工作:

 set :ssh_options, {:forward_agent => true} 

然后我在Dreamhost wiki上提到执行

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

而现在我可以不使用密码进行部署。

日志显示它通过SSHlogin到jellly.com后提示input密码,所以它看起来像实际的git更新提示input密码。

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

您应该创build一个匿名的git帐户,并像这样更改您的回购行:

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

或者,你可以把你的SSH密钥放在你的生产服务器上,但是这听起来不是很有用。 您也可以configurationSSH以通过初始SSH连接将身份validation请求转发回去。 但是,用于部署的匿名只读源代码控件可能更容易。

我复制并粘贴我的本地machie id_rsa.pub键到远程服务器authorized_key文件,它的工作

如果您使用的Windows工作站(便携式)有时直接连接到企业内部networking,有时通过VPN进行连接,则可能会发现在运行远程pipe理任务时出现不一致的行为,要求input密码。

在我的情况下,我们公司的login脚本在login时执行,而您已经连接到公司LAN,将您的HOME目录设置为networking共享位置。 如果您从caching的凭证login,然后VPN进入,您的主目录不会由login脚本设置。 存储您的私钥的.ssh目录可能只位于其中一个位置。

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

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

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