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 密钥的主要内容,如果未能解决你的问题,请参考以下文章