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

6ju8rftf  于 2023-05-06  发布在  Ruby
关注(0)|答案(7)|浏览(191)

我的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.

有什么可以打破?

kdfy810k

kdfy810k1#

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

wz8daaqr

wz8daaqr2#

密码提示是因为你部署的服务器正在连接到git服务器,需要验证。因为你的本地机器(你部署 from 的地方)已经有了一个有效的ssh-key,所以在Capfile中启用转发就可以使用它:

set :ssh_options, {:forward_agent => true}

当部署服务器尝试连接到您的git服务器时,它会从您的本地机器转发身份验证。
这比将私钥放在部署服务器上要好得多!
当服务器通过ssh'ing返回自身时,绕过密码提示的另一种方法是告诉capistrano不要这样做。感谢丹尼尔Quimper的capistrano-site 5 github repo的'readme'部分,我们注意到以下内容:

set :deploy_via, :copy

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

eimct9ow

eimct9ow3#

我也遇到过同样的问题。
这条线不起作用:

set :ssh_options, {:forward_agent => true}

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

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

现在我可以部署没有密码。

xwmevbvl

xwmevbvl4#

日志显示,在通过SSH登录www.example.com后,它会提示输入密码jellly.com,因此看起来实际的git更新会提示输入密码。
我认为这是因为你的仓库设置指定了你的git用户,即使你可以匿名访问它。
你应该创建一个匿名的git帐户,并像这样修改你的repo行:

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

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

lqfhib0f

lqfhib0f5#

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

qltillow

qltillow6#

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

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

iugsix8n7#

如果您使用的Windows工作站(便携式)有时直接连接到内部公司网络,有时通过VPN连接,您可能会发现在运行要求您输入密码的cap远程任务时出现不一致的行为。
在我的情况下,我们公司有登录脚本,当您登录时,在已经连接到公司LAN的情况下执行,该脚本将您的HOME目录设置为网络共享位置。如果您从缓存的凭据登录,然后在中使用VPN,则登录脚本不会设置您的主目录。存储私钥的.ssh目录可能只在其中一个位置。
在这种情况下,一个简单的解决方法是将.ssh目录从有它的HOME复制到没有它的HOME。

相关问题