我的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.
什么可以被打破?
答案 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