Установите umask для удаленных команд

Как я могу направить процессы, запущенные на удаленных машинах, через ssh для запуска с определенным umask? Я хочу, чтобы это применимо к командам, выполняемым как часть стандартных рецептов Capistrano, поэтому я не могу просто сделать явный вызов части команды "umask".

Не получается, что ~/.bash_profile на удаленном компьютере читается, так как Capistrano вызывает удаленные команды.

4 ответа

Я столкнулся с той же проблемой и обошел ее, используя затем недокументированный SSHKit.config.umask в config/deploy.rb. Обратите внимание, что для каждой команды ssh устанавливается umask.


Поместите umask 0002 в .bashrc учетной записи пользователя, которую вы используете для развертывания.


Согласовано с Alain - установите umask в .bashrc вместо .bash_profile. При развертывании с Capistrano в типичной настройке ваш .bash_profile по умолчанию не загружается. Если читать разница между .bashrc и .bash_profile поможет понять смысл этих двух. У меня есть переменные среды, установленные в моем файле .bashrc, и они, безусловно, используются при развертывании или для запуска любых других команд с capistrano.

Другой вариант - создать задачу для установки значения umask, прежде чем приступать к созданию файлов при развертывании. Например, в Cap 3 вы можете использовать это:

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


@****** ответ с использованием SSHKit хорош, но он работает только для Capistrano 3, поскольку Capistrano 2 не использует SSHKit.

Общей проблемой в отношении umask и Capistrano является то, что bundle install устанавливает драгоценные камни с ограниченными правами. Для этой конкретной проблемы решение, которое я нашел для Capistrano 2, состоит в том, чтобы сказать:

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

licensed under cc by-sa 3.0 with attribution.