2011-09-23 58 views
2

工作我有一個Rails應用程序,用戶可以在提交表單,它熄滅,通過ssh連接到遠程服務器調用的腳本。最終我打算使用delayed_job或類似的東西,但即使是一個簡單的測試,我也無法讓它在生產環境中工作。的Net :: SSH從生產軌道控制檯,AuthenticationFailed從生產的webapp

奇怪的是,淨:: SSH工作得很好,從生產中的控制檯,但它失敗AuthenticationFailed當我在生產中提交表單。控制檯和webapp在開發過程中都可以正常工作。

錯誤:

Net::SSH::AuthenticationFailed (my_ssh_username):

app/models/branch.rb:69:in `ssh_to_machine'

app/controllers/branches_controller.rb:55:in `update'

控制器的更新動作:

def update 
    @branch = Branch.find(params[:id]) 
    if @branch.update_attributes(params[:branch]) 
     @branch.ssh_to_machine(@branch.hostname, @branch.user_name, @branch.command_to_run) 
     redirect_to @branch, :notice => "Update request now processing." 
    else 
     render :action => 'edit' 
    end 
    end 

方法我打電話,主要是複製/從網上粘貼:: SSH API例如:

def ssh_to_machine(host_name, user_name, command_to_run) 
    require 'net/ssh' 
    Net::SSH.start(host_name, user_name, { :verbose => Logger::DEBUG, :keys => %w{ /home/www-data/.ssh/my_ssh_username_id_rsa }, :auth_methods => %w{ publickey } }) do |ssh| 
     # capture all stderr and stdout output from a remote process 
     output = ssh.exec!("hostname") 

     # run multiple processes in parallel to completion 
     ssh.exec command_to_run 
     ssh.loop 
    end 
end 

我已經嘗試過,沒有:verbose,:keys,:auth_methods;每次都要小心地重新啓動apache,但在生產過程中,它總是從控制檯運行(RAILS_ENV =在調用'rails c'之前導出的生產),並且從不從webapp運行。

我也歡迎就如何獲得增強記錄任何建議時,我從web應用程序調用它 - :在控制檯上冗長的工作對我來說卻沒有我的production.log添加任何東西。

+0

當你用'rails c production'啓動控制檯時它工作嗎? – rdvdijk

+0

是的,謝謝@rdvdijk,我只是試過'rails c production',它工作正常。 – wonderfulthunk

+0

只是爲了澄清,「rails c production」和SSH在生產控制檯上工作正常,但它仍然從生產webapp失敗。 – wonderfulthunk

回答

0

當您從控制檯運行它,你用自己的帳戶,對不對?

這有點奇怪,但我的猜測是您的製作網站應用程序在沒有讀取訪問權限的帳戶下運行「/home/www-data/.ssh/my_ssh_username_id_rsa」。

從你的描述,幾乎已是某種權限問題。

+0

當我從控制檯運行時,我正在使用www-data帳戶。我再次檢查了權限,並且/home/www-data/.ssh/my_ssh_username_id_rsa是-rw ------- 1 www-data www-data。這似乎也證實,如果我在控制檯上運行時不是www-data,我會遇到相反的問題(不是在控制檯工作,而是在生產環境中工作)。我認爲這只是一個奇怪的「無外殼訪問」權限/安全的事情,沒有人知道,因爲沒有人足夠愚蠢(像我一樣)嘗試直接在其rails應用程序的後端運行unix shell命令。 – wonderfulthunk