2013-02-11 23 views
2

我是一個capistrano的新手,並且一直對我的頭撞這個問題幾天,所以真的很感謝一些幫助。作爲不同的用戶運行capistrano任務

我們有一個煩人的安全設置,這意味着我不能像ssh用戶那樣在遠程服務器上運行capistrano任務。這是一個簡單的版本This problem - 這似乎沒有一個工作的答案。

編輯: 進一步鑽研這個,我發現我可以這樣做:

run "su - newuser" do |channel, stream, data| 

      channel.send_data("#{password}\n") 

      channel.send_data("rm -rf #{release_path}\n") 

     end } 

我可以用它來覆蓋默認的部署方法,並且大多數的什麼,我需要做的。我可以在服務器上創建所需的目錄等,並使用ssh轉發從git作爲ssh用戶。這造成了我的下一個問題。我現在擁有由newuser擁有的目錄,其中包含ssh_user擁有的文件和目錄。我具有sudo特權作爲newuser,但無法解決如何chmod文件。我已經嘗試過這樣的東西:

run "su - newuser" do |channel, stream, data 

       channel.send_data("#{password}\n") 

       channel.send_data("sudo chmod 775 #{cache_path}\n") 

      end } 

但是一切都只是掛起,看起來好像該塊在無限循環中執行。很顯然,這裏有很多我不明白的地方,一些指針會被大大讚賞 - 即使只是一個很好的相關閱讀。

+0

所以,你想連接爲一個用戶,然後'sudo su'給另一個用戶?如果您要手動登錄到服務器,您會採取哪些步驟? – PinnyM 2013-02-11 17:07:05

+0

正確 - 我不能sudo,但我可以su - 看到下面的答案更詳細的意見 – chrispanda 2013-02-11 18:55:41

回答

2

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invocation-Run 顯示您:對於運行shell選項,你可以設置爲:

run "your cmd", :shell => "su - other_user -s bash" 
如果您使用預定義的任務

,你最好重新運行和蘇合併shell選項。 這假定你的ssh用戶可以沒有密碼su。如果不使用塊發送密碼:

run "your cmd", :shell => "su - other_user -s bash" do |channel, stream, data| 
    channel.send_data("#{other_user_password}\n") 
end 
+0

這是非常接近我一直在嘗試的事情,並且無法去工作。我可以su - 給塊中的新用戶,我回到數據中提示su成功的提示 - 但後來我實際上無法做更多的事情 - 顯然我錯過了一些東西... – chrispanda 2013-02-11 18:54:41

+1

haave你只是嘗試'sudo「cmd」,:as => other_user'? – 2013-02-12 11:56:56

+0

這是問題的核心 - ssh用戶不在sudoers列表中 – chrispanda 2013-02-12 12:04:04

0

我終於想出瞭解決的辦法是採取一切現有的部署任務,並把它們放在一個新的命名空間。然後我用一種新方法調用他們運行的腳本,具體取決於我是否需要以新用戶或root身份運行它們,雖然它與Viktor的解決方案不盡相同,但它仍然接受他的答案,即使它不起作用對我來說

def run_as(user, password, command, env) 
     run "#{command}\n", :shell => "su - #{user}", :env => env do |channel, stream, data| 
     channel.send_data("#{password}\n") 
     end 
end 
相關問題