Я пишу сценарий, который должен запускаться с разрешениями sudo.
Но затем мне нужно выполнить команду от другого пользователя, который использует его .bash_rc
, где есть некоторые переменные env, которые перегружены, а затем использовать его в команде.
Например. Мне нужно напечатать переменную PATH
для пользователя:
sudo -s -u ${USER_NAME} source ~/.bash_rc; echo $PATH
Но вместо этого он печатает PATH
для пользователя, выполняющего сценарий.
Я также пробовал много других вариантов (с su
или передачей rcfile), но ни один из них, похоже, не работает.
Как мне с этим справиться?
Вы можете выполнить это как:
sudo su - ${USER_NAME} -c 'source ~/.bash_rc; echo $PATH'
Пример работы. Пользователь "zippy" имеет файл ~/.bash_rc. Обратите внимание, что это дополнение к стандартному файлу ~/.bashrc. Пользователь, выполняющий команду, «бщук» не делает. Файл ~zippy/.bash_rc содержит:
#!/bin/bash
# .bash_rc
PATH=$PATH:/this/is/a/dummy/path
Выполнение этой команды работает:
bschuck@valhalla:~$ sudo su - zippy -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:\
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin:\
/this/is/a/dummy/path
Однако эта команда не сохраняет новую PATH, полученную из файла ~zippy/.bash_rc:
bschuck@valhalla:~$ sudo -i -u zippy bash -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:/usr/local/sbin:\
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:\
/snap/bin
Если вам нужно запустить несколько команд, лучше всего поместить их в сценарий, как я предложил вчера в комментарии к моему ответу.
У вас есть команда sudo
, которая вызывает сценарий. У вас также есть команда, которая выводит $PATH
. В остальном они не связаны.
Возможно, вы имели в виду следующее:
sudo -u "${USER_NAME}" bash -c 'source ~/.bash_rc; echo $PATH'
-s
нельзя использовать с составной командой, но ее можно использовать со сценарием, содержащим две (или более) команды:
cat >/opt/bin/show_me_the_path <<'X'
#!/bin/bash
source ~/.bash_rc
echo $PATH
X
chmod a+x /opt/bin/show_me_the_path
sudo -u "${USER_NAME}" -s /opt/bin/show_me_the_path
Но даже это не имеет особого смысла, потому что скрипт требует свою собственную оболочку (/bin/bash
). В общем, лучше переосмыслить флаг -s
.