Я пытаюсь найти способ разрешить пользователю john выполнять команду (скажем, echo) от имени другого пользователя peter без запроса пароля.
Я нашел ветку, которая, как я думал, будет ответом на мой вопрос:
john ALL = (ALL) NOPASSWD: /bin/echo
К сожалению, это не совсем то, что я хочу. Эта команда выполняет echo
команда как peter
но в контексте john
. Это означает, что домашний каталог остается директорией john
.
Как пользователь john
, если я бегу: "sudo -u peter echo ~
", ответ: /home/john
. Я хочу, чтобы это было /home/peter
.
Ожидаемое мной поведение обеспечивается командой su. Как root, если я это сделаю: su peter -c "echo ~"
, Я получил /home/peter
.
Вопрос в том, как мне узнать поведение su
, без root и без запроса пароля?
Вам необходимо указать -i
флаг, чтобы sudo читал сценарии входа и т. д. и устанавливал переменные среды, как они должны быть. Без загрузки среды sudo переменная домашней среды не обновляется, чтобы отразить запуск от имени пользователя.
"sudo -u peter echo ~" интерпретирует значение ~ перед выполнением команды sudo. Пытаться
sudo -s -H -u peter echo \$HOME
или
sudo -i -u peter echo \$HOME
Кроме того, чтобы просмотреть все переменные среды, установленные sudo, попробуйте:
sudo -i -u peter export
# actually, use /usr/bin/env instead of export
ОБНОВИТЬ
При использовании -i или -s вы подразумеваете, что запускаемый SUDO_COMMAND является средой оболочки указанного пользователя. Таким образом, разрешения только / bin / echo недостаточно, нужно разрешить доступность всего / bin / bash.
Кажется, что -H достаточно, чтобы установить переменную среды HOME, но вы не можете повторить ее с помощью $ HOME, потому что это функция оболочки. Другие программы могут считывать значение HOME с помощью getenv () или аналогичных методов.
sudo -H -u peter /usr/bin/env | grep SUDO_COMMAND
SUDO_COMMAND=/usr/bin/env
sudo -i -u peter /usr/bin/env | grep SUDO_COMMAND
SUDO_COMMAND=/bin/bash -c /usr/bin/env