Set umask for remote commands

十年热恋 提交于 2019-12-12 11:45:14

问题


How can I direct processes started on remote machines via ssh to run with a certain umask? I want this to apply to commands run as part of standard Capistrano recipes too, so I can't just make an explicit call to "umask" part of the command.

It does not appear that ~/.bash_profile on the remote machine is read, with the way that Capistrano invokes remote commands.


回答1:


I was confronted to the same issue and got around it by using the then-undocumented SSHKit.config.umask in config/deploy.rb. Note that this will set the umask for every ssh command.




回答2:


Put umask 0002 in the .bashrc of the user account you use to deploy.




回答3:


Agreed with Alain--set the umask in your .bashrc instead of .bash_profile. When deploying with Capistrano in a typical setup, your .bash_profile isn't loaded by default. Reading up on the difference between .bashrc and .bash_profile will help in understanding the purposes of the two. I have environment variables set in my .bashrc file and they are certainly used when I deploy or for running any other commands with capistrano.

Another option is to create a task to set your umask value before you begin creating files on deploy. For example, in Cap 3, you can use this:

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



回答4:


@beauby's answer using SSHKit is good, but it works only for Capistrano 3 as Capistrano 2 doesn't use SSHKit.

A common problem in relation to umask and Capistrano is that bundle install installs gems with permissions that are too restrictive. For this specific issue, the solution I've found for Capistrano 2 is to say:

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

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


来源:https://stackoverflow.com/questions/21465706/set-umask-for-remote-commands

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!