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

具体说明:我正在将Sinatra应用程序部署到Dreamhost共享帐户(使用Passenger).很久以前,我就遵循了一个指导,当时效果很好.从那以后有东西坏了.我使用的是capistrano(2.5.9)和git版本1.6.1.1.这是我的档案:

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.

什么东西会坏?

推荐答案

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

set :ssh_options, {:forward_agent => true}

当部署服务器try 连接到git服务器时,它会从本地计算机转发身份验证.

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

另一种在服务器ssh恢复时绕过密码提示的方法是告诉capistrano不要这样做.感谢Daniel Quimper的capistrano-site5 github回购的"自述"部分,我们注意到以下几点:

set :deploy_via, :copy

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

Ruby-on-rails相关问答推荐

Rails HotWire和View Components:涡轮框架不会取代内容

HTTP:MimeNegotiation::InvalidType(html不是有效的MIME类型):""

是否从已转换为字符串的数组中提取符号?

显示每个 rspec 示例的运行时

如何启动 rails 控制台并专门使用测试数据库?

如何在 to_json 中获取回形针图像的 url

验证以确保唯一性但忽略空值?

有没有办法在 Rails 3.1 中检测用户代理

在 Rails 3.2 中更新多行

在 Windows 上使用 Ruby 进行开发

在 Rails 4 中检测用户代理 - 读取 HTTP 标头

从 before_action 中排除控制器

Heroku 错误 R14(超出内存配额):我该如何解决?

Rails 文章助手 - a 或 an

Rails 5:无法从参数中检索哈希值

如何在 RSpec 中包含 Rails 助手

如何为模型添加属性?

快速添加链接[:notice]

通过get in rails传递参数数组

是否可以输出rake db:migrate产生的 SQL 更改脚本?