2014-01-30 38 views
4

如何通過ssh啓動遠程機器上的進程以使用某個umask運行?我希望這適用於作爲標準Capistrano食譜的一部分運行的命令,所以我不能只是明確地調用「umask」命令的一部分。設置遠程命令的umask

看起來,遠程計算機上的〜/ .bash_profile沒有被讀取,而Capistrano調用遠程命令的方式。

回答

2

我面臨的同樣的問題,並圍繞它通過了在config/deploy.rb使用當時無證SSHKit.config.umask。請注意,這將爲每個ssh命令設置umask

+0

如果您使用'execute('some command')'語法,只需要說明這一點不起作用,您必須使用'execute(:some,'command')',以便通過[命令映射](https://github.com/capistrano/sshkit#the-command-map) – robd

+0

這隻適用於Capistrano 3. Capistrano 2不使用SSHKit。 –

+0

如何正確應用? –

1

umask 0002在您用來部署的用戶帳戶的.bashrc

0

與Alain同意 - 在您的.bashrc中設置umask而不是.bash_profile。在典型安裝中使用Capistrano進行部署時,默認情況下不會加載.bash_profile。閱讀the difference between .bashrc and .bash_profile將有助於理解這兩者的目的。 我在我的.bashrc文件中設置了環境變量,當我部署或用capistrano運行任何其他命令時,肯定會使用它們。

另一個選項是在開始在部署上創建文件之前創建一個設置umask值的任務。例如,在第3章,您可以使用此:

task :set_umask do 
    on roles(:all) do |host| 
    execute "umask 0002" 
    end 
end 
before "deploy:starting", "set_umask" 
+4

您的基於capistrano的解決方案似乎不起作用。但是,在config/deploy.rb中設置SSHKit.config.umask =「0002」會有訣竅。 – beauby

+1

@beauby哦上帝,這是沒有記錄**任何地方**。謹慎地做出這個答案? –

+0

@FelixFrank:是的,我記得很難找到它......完成! – beauby

0

@ beauby使用SSHKit的答案很好,但它僅適用於Capistrano 3,因爲Capistrano 2不使用SSHKit。

umask和Capistrano有關的一個常見問題是bundle install安裝的gem的權限過於嚴格。對於這個特定的問題,我發現Capistrano 2的解決方案是:

namespace :bundle do 
    task :postinstall do 
    run "chmod -R u=rwX,go=rX #{bundle_dir}" 
    end 
end 

after 'bundle:install', 'bundle:postinstall'