У меня возникли некоторые проблемы с нашим авторским скриптом, который меняет пользователя и запускает несколько процессов ruby daemon.
В прошлом я просто bash -c "do the business" -l someuser
использовал -l
флаг для эмуляции входа в систему.
До сих пор это прекрасно работало, наш процесс ruby выдавал следующую ошибку: require: no such file to load -- rubygems (LoadError)
после некоторого исследования я обнаружил, что эта ошибка возникает только тогда, когда я запускаю скрипт от имени пользователя root, то есть (когда я sudo su
запускаю upstart).
Я думаю, что это проблема ПУТИ, так как, когда я сначала вручную устанавливаю путь, это решает проблему.
Есть ли способ изменить пользователя и загрузить всю среду?
Я тоже пробовал su user -c
и sudo
.
Чтобы упростить тестирование, я "рутирую" ( sudo su
) и работаю which bundle
(связка - вещь рубина).
Вот что я получаю:
sudo -i -u webuser which bundle
# => нет выводаsu -l webuser -c which bundle
# => нет выводаsudo su - webuser -c which bundle
# => нет вывода
Но ssh'd в качестве веб-пользователя
which bundle
# => / opt / ruby / bin / bundle
источник
su - user -c
?/etc/profile
~/.bash_profile
~/.bash_login
и~/.profile
. Для оболочек входа в систему bash оценивает их в заданном порядке.Ответы:
Использование
sudo su - user -c
сделает так, как будто вы вошли в систему как тот человек, который наследует их путь. Вот почемуsu user
отличается отsu - user
.Однако, если вы задаете путь в
.bashrc
файле, он вступит в силу только для интерактивных сеансов (т. Е. Ssh-в качестве этого пользователя).Вместо этого вы должны использовать
.bash_profile
или/etc/profile
, увидеть это .источник
su -
иsu -l
являются синонимами.--login
для удобства чтения.Для контекста входа используйте:
sudo -i -u USER COMMAND
su -l USER -c COMMAND
источник