2

Когда я запускаю эти команды, он выводит, как показано. / корень

$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root    
$ su - someuser -c "echo $HOME"
/root

То, что я ожидал, было

/home/someuser

Когда я запускаю команду env для проверки среды, она правильно сообщает о переменной HOME.

$ su - someuser -c "env"
...  
HOME=/home/someuser
...

$ sudo -u someuser -i "env"  
...  
HOME=/home/someuser
...

$ runuser -l someuser -c "env"  
...  
HOME=/home/someuser
...  

Я хочу запустить скрипты в домашнем каталоге пользователя. / главная / someuser / скрипты.
как $ {HOME} /scripts/somescript.sh

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found  

То, что я ожидал, было:

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
...
script output.
...

2 ответа2

3

Когда вы делаете

 su - someuser -c "echo $HOME"

Текущая оболочка сначала расширяет $ HOME, затем результат передается команде (в данном случае su ), а затем процессу оболочки, работающему от имени нового пользователя.

Попробуйте защитить переменную одинарными кавычками

 su - someuser -c 'echo $HOME'
1

Тангенциально связанные:

sudo -u someuser -i "echo $HOME"

не работает для меня вообще. Это говорит:

-bash: echo $HOME: command not found

К моменту: когда вы выполняете команду

sudo -u someuser -i echo $HOME

переменная $HOME раскрывается оболочкой еще до того, как sudo выполнится.

Чтобы решить эту проблему, вы можете использовать команду как

sudo -u someuser -i bash -c 'echo $HOME'

В этой команде echo $HOME отправляется буквально в bash после переключения UID.

Результат, как и ожидалось:

/home/someuser

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .