我的ssh密钥绝对设置正确,因为在使用ssh时从来没有提示输入密码。但是capistrano在使用cap deploy
部署时仍然要求输入密码。奇怪的是,当我用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"
下面是当I 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条答案
按热度按时间kdfy810k1#
在我的本地机器上执行
ssh-add ~/.ssh/id_rsa
为我解决了这个问题。看起来ssh命令行工具在用Capistrano调用时没有检测到我的身份。wz8daaqr2#
密码提示是因为你部署的服务器正在连接到git服务器,需要验证。因为你的本地机器(你部署 from 的地方)已经有了一个有效的ssh-key,所以在Capfile中启用转发就可以使用它:
当部署服务器尝试连接到您的git服务器时,它会从您的本地机器转发身份验证。
这比将私钥放在部署服务器上要好得多!
当服务器通过ssh'ing返回自身时,绕过密码提示的另一种方法是告诉capistrano不要这样做。感谢丹尼尔Quimper的capistrano-site 5 github repo的'readme'部分,我们注意到以下内容:
显然,这适用于应用程序和git存储库托管在同一主机上的情况。但我想我们中的一些人正在这样做:)
eimct9ow3#
我也遇到过同样的问题。
这条线不起作用:
然后我执行了Dreamhost wiki上提到的
现在我可以部署没有密码。
xwmevbvl4#
日志显示,在通过SSH登录www.example.com后,它会提示输入密码jellly.com,因此看起来实际的git更新会提示输入密码。
我认为这是因为你的仓库设置指定了你的git用户,即使你可以匿名访问它。
你应该创建一个匿名的git帐户,并像这样修改你的repo行:
或者,您可以将SSH密钥放在生产服务器上,但这听起来并不有用。您还可以配置SSH,通过初始SSH连接将身份验证请求转发回去。不过,部署的匿名只读源代码控制可能更容易。
lqfhib0f5#
我复制并粘贴我的本地machie id_rsa.pub密钥到远程服务器authorized_key文件,它工作了
qltillow6#
手动复制公钥到authorized_keys在我的情况下不起作用,但通过服务进行工作,当我发现服务只是在最后添加了一个相同的密钥
iugsix8n7#
如果您使用的Windows工作站(便携式)有时直接连接到内部公司网络,有时通过VPN连接,您可能会发现在运行要求您输入密码的cap远程任务时出现不一致的行为。
在我的情况下,我们公司有登录脚本,当您登录时,在已经连接到公司LAN的情况下执行,该脚本将您的HOME目录设置为网络共享位置。如果您从缓存的凭据登录,然后在中使用VPN,则登录脚本不会设置您的主目录。存储私钥的.ssh目录可能只在其中一个位置。
在这种情况下,一个简单的解决方法是将.ssh目录从有它的HOME复制到没有它的HOME。