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

Posted

技术标签:

【中文标题】Capistrano 在部署时要求输入密码,尽管有 SSH 密钥【英文标题】:Capistrano asks for password when deploying, despite SSH keys 【发布时间】:2011-03-17 05:20:56 【问题描述】:

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

这是当我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.

什么东西会坏掉?

【问题讨论】:

【参考方案1】:

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

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

您应该创建一个匿名 git 帐户并像这样更改您的 repo 行:

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

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

【讨论】:

谢谢,解决了!看起来设置另一个用户也可以,但我只是让服务器自己的 ssh 密钥自行授权 - 简单且没有安全风险。使用这个:cat ~/.ssh/id_rsa.pub | ssh ehsanul@jellly.com 'cat >> .ssh/authorized_keys' 嗯,实际上,如果没有 ssh,不只指定 set :repository, /home/ehsanul/git/jellly.git 也能正常工作吗?编辑:不,不起作用。 我很高兴你能成功。将您的私钥保存在服务器上是一种安全风险,您应该只将公钥存储在那里。至少这证实了这个问题。我建议使用匿名或受限访问帐户,而不是在应用服务器上发布您的私钥。 澄清一下,我没有把我的私钥放在服务器上。有关我所做的事情,请参阅我对其他答案的评论。【参考方案2】:

密码提示是因为你要部署的服务器正在连接git服务器,需要认证。由于您的本地机器(您正在部署的地方)已经有一个有效的 ssh-key,通过在 Capfile 中启用转发来使用它:

set :ssh_options, :forward_agent => true

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

这比将您的私钥放在部署服务器上要好得多!

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

set :deploy_via, :copy

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

【讨论】:

我没有把我的私钥放在服务器上。我刚刚将部署服务器的公钥添加到它自己的authorized_keys 列表中。这是因为部署服务器也是我的 git 服务器,显然由于 Capistrano 的工作方式,它会尝试 ssh 进入自身,从而导致密码登录。所以我基本上只是在服务器和自身之间设置了 ssh 密钥。比把我的私钥放在那里安全得多;)我会尝试 forward_agent 的东西,看起来像一个更清洁的解决方案。谢谢! :) 如果其他人想知道为什么会这样以及它在哪里记录,这些是 Net:SSH 的选项,请参阅 net-ssh.github.com/ssh/v1/chapter-2.html 中的“选项”。 顺便说一句,如果你仍然有问题,尤其是在使用自定义命名键时,试试这个:ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "my_custom_id_rsa")]【参考方案3】:

我也遇到了同样的问题。

这条线没有用:

set :ssh_options, :forward_agent => true

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

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

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

【讨论】:

该行本身不应该工作。它只是启用代理转发。如果您一开始就没有运行它,那将不会有太大帮助。 你应该添加你的私钥,而不是公开的。 我一直这样做,但仍然要求输入密码。我的配置是set :ssh_options, forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa.pub) 您可能还想将添加到项目设置中的 ssh 私钥的指纹添加到 config.yml...【参考方案4】:

如果您使用的 Windows 工作站(便携式)有时直接连接到内部公司网络,有时通过 *** 连接,您可能会发现在运行 cap 远程任务时会出现不一致的行为,要求您输入密码。

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

我将该命令添加到我的 bash_profile 文件中,因此我确信无论我在哪里开始新的终端会话,都会加载默认身份。 这也为我解决了这个问题,但现在和他们(似乎是随机的)我必须再次运行它。 不确定这是升级到 OSX Sierra 还是什么,但我必须做同样的事情。 这些出色的复制/粘贴答案之一可以挽救一天!谢谢 我在 macOS Sierra 上使用 Capistrano 3 部署 Rails 应用程序时遇到问题(在 Yosemite 上一切正常),每次都提示我输入密码(但使用 Capistrano 2 一切正常)问题已使用解决这个链接 - help.github.com/articles/…【参考方案6】:

我将我的本地机器 id_rsa.pub 密钥复制并粘贴到远程服务器的授权密钥文件中,它起作用了

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于Capistrano 在部署时要求输入密码,尽管有 SSH 密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何在通过 Capistrano 部署 Rails 应用程序时输入 ssh 密钥的密码?

使用 Capistrano 简化部署

Capistrano 部署问题

使用 pem 文件与 capistrano 一起部署

TortoiseGit尝试推送时要求我输入密码

Capistrano - 清理旧版本