58

我的 ssh 密钥肯定设置正确,因为在使用 ssh 时从未提示我输入密码。但是 capistrano 在部署时仍然要求输入密码cap deploycap deploy:setup奇怪的是,当我设置时它不会要求输入密码。如果没有密码提示,这将使部署周期更加顺畅。

细节:我正在将 Sinatra 应用程序部署到 Dreamhost 共享帐户(使用乘客)。我很久以前就遵循了一个教程,当时它工作得很好。从那以后有些东西坏了。我正在使用 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.

什么东西能破?

4

7 回答 7

72

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

于 2014-01-22T11:51:47.387 回答
56

密码提示是因为您要部署的服务器正在连接到 git 服务器并且需要身份验证。由于您的本地机器(您从中进行部署)已经有一个有效的 ssh-key,请通过在 Capfile 中启用转发来使用该密钥:

set :ssh_options, {:forward_agent => true}

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

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

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

set :deploy_via, :copy

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

于 2010-09-04T20:34:13.247 回答
18

我有同样的问题。

这条线没有用:

set :ssh_options, {:forward_agent => true}

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

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

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

于 2011-02-20T03:07:31.373 回答
3

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

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

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

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

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

于 2010-07-17T02:31:11.317 回答
1

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

于 2016-09-08T19:37:14.763 回答
1

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

ssh-copy-id ~/.ssh/id_rsa.pub user@remote
于 2017-05-17T04:55:12.420 回答
0

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

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

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

于 2013-02-19T19:35:19.987 回答