2010-07-16 123 views
44

我的ssh密鑰已經正確設置,因爲在使用ssh時從未提示輸入密碼。但是,當使用cap deploy進行部署時,capistrano仍會要求輸入密碼。奇怪的是,當我使用cap deploy:setup進行設置時,它並沒有要求輸入密碼。如果沒有密碼提示,它會使部署週期變得更加順暢。Capistrano在部署時要求輸入密碼,儘管使用SSH密鑰

細節:我將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, "[email protected]: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 [email protected]: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 [email protected]: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] [email protected]'s password: 
Password: 
** [jellly.com :: out] 
** [jellly.com :: out] remote: Counting objects: 7, done. 
remote: Compressing objects: 100% (4/4), done. 

什麼可能被打破?

回答

51

密碼提示是因爲您正在部署的服務器連接到git服務器並需要身份驗證。由於本地計算機(要部署從)已經有一個有效的SSH密鑰,使用一個啓用轉發在Capfile:

set :ssh_options, {:forward_agent => true} 

即通過從本地機器轉發驗證時,如果部署服務器嘗試連接到你的git服務器。

這比將您的私鑰放在部署服務器上更受歡迎!

當服務器重新啓動時,繞過密碼提示的另一種方法是告訴capistrano不要這樣做。感謝丹尼爾坎佩爾的capistrano-site5 GitHub庫的「自述」一節中,我們注意以下幾點:

set :deploy_via, :copy 

顯然,這個工程的其中兩個應用程序和git倉庫正在同一主機上託管的情況。但我想我們中的一些人正在這樣做:)

+3

我沒有把我的私鑰放在服務器上。我只是將部署服務器的公鑰添加到它自己的'authorized_keys'列表中。這是因爲部署服務器也是我的git服務器,並且顯然它由於Capistrano的工作方式而嘗試進入ssh,導致密碼登錄。所以我基本上只是在服務器和它自己之間設置了ssh密鑰。比把我的私鑰放在那裏安全得多;) 雖然我會嘗試forward_agent的東西,看起來像一個更清潔的解決方案。謝謝! :) – ehsanul 2010-09-04 21:50:20

+0

工作對我來說非常好。 – kain 2011-10-22 08:30:23

+0

如果其他人想知道爲什麼會這樣工作,它在哪裏記錄,這些是Net:SSH的選項,請參閱http://net-ssh.github.com/ssh/v1/chapter-2.html中的「選項」。 – oseiskar 2013-02-16 13:16:24

3

日誌顯示它在通過SSH登錄到jellly.com後提示輸入密碼,因此它看起來像實際的git更新提示輸入密碼。

我認爲這是因爲您的存儲庫設置指定您的git用戶,即使您可以在這種情況下匿名訪問它。

您應該創建一個匿名的git帳戶,並改變你的回購一行:

set :repository, "[email protected]:git/jellly.git" 

或者,你可以把你的SSH密鑰對生產服務器,但是,這並不有益無害。您還可以配置SSH以通過初始SSH連接將身份驗證請求轉發回去。不過,用於部署的匿名只讀源代碼控件可能更容易。

+2

謝謝,修復了它!看起來設置另一個用戶也可以工作,但我只是想讓服務器自己的ssh密鑰與自己一起授權,這很簡單,沒有安全風險。使用這個:'cat〜/ .ssh/id_rsa.pub | SSH [email protected]「貓>>的.ssh/authorized_keys'' – ehsanul 2010-07-17 09:30:50

+0

嗯,其實,不只是指定'設置:倉庫,/家庭/ ehsanul /混帳/ jellly.git'工作爲好,沒有SSH?編輯:不,不起作用。 – ehsanul 2010-07-17 09:41:13

+0

我很高興你有這個工作。將私鑰保存在服務器上存在安全風險,您只能在其中存儲公鑰。至少這證實了這個問題。我建議使用匿名或有限訪問帳戶,而不是在應用服務器上發佈私鑰。 – Winfield 2010-07-17 17:31:53

16

我有同樣的問題。

此行did'nt工作:

set :ssh_options, {:forward_agent => true} 

然後我執行Dreamhost上維基提到

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

現在我可以沒有密碼部署。

+2

這行本身不應該工作。它只是啓用代理轉發。如果你一開始沒有跑步,那也不會有太大的幫助。 – 2012-05-29 14:21:44

+2

你應該添加你的私鑰,而不是公開的。 – DaveStephens 2013-10-28 15:35:20

+0

我一直這樣做,但仍然要求輸入密碼。我的配置是'set:ssh_options,{forward_agent:true,user:fetch(:user),keys:%w(〜/ .ssh/id_rsa.pub)}' – 2015-08-08 14:35:31

0

如果您使用的是Windows工作站(便攜式),你有時會直接停靠到公司內部網絡,有時通過VPN連接,你可能會發現你在運行帽遠程任務要求您輸入密碼不一致的行爲。

在我的情況,我公司已登錄了執行,當你登錄時已經連接到公司局域網是設置你的HOME目錄到網絡共享位置的腳本。如果您從緩存的憑證登錄,然後VPN進入,您的主目錄不會由登錄腳本設置。存儲您的私鑰的.ssh目錄可能只位於其中一個位置。

在這種情況下一個簡單的辦法是隻從它有不適用的一個HOME複製.ssh目錄。

55

在我的本地機器執行ssh-add ~/.ssh/id_rsa固定我的問題。看起來ssh命令行工具在用Capistrano調用時沒有檢測到我的身份。

+2

我將該命令添加到了我的bash_profile文件,所以我確信默認身份加載在我開始新終端會話的任何地方。 – 2016-11-22 17:59:17

+0

這解決了我的問題! – 2017-01-28 12:14:54

+0

這對我有用。 – rocLv 2017-03-17 10:57:07

1

我複製並粘貼在我的本地馬希id_rsa.pub鍵遠程服務器authorized_key文件和它的工作

0

手動複製公鑰的authorized_keys在我的情況下,沒有工作,但通過服務做它的工作,當我發現服務簡單地在最後加了一個相同的密鑰

ssh-copy-id ~/.ssh/id_rsa.pub [email protected] 
相關問題