Исходный .bash_rc при запуске su в скрипте

Я пишу сценарий, который должен запускаться с разрешениями sudo. Но затем мне нужно выполнить команду от другого пользователя, который использует его .bash_rc , где есть некоторые переменные env, которые перегружены, а затем использовать его в команде.

Например. Мне нужно напечатать переменную PATH для пользователя:

sudo -s -u ${USER_NAME} source ~/.bash_rc; echo $PATH

Но вместо этого он печатает PATH для пользователя, выполняющего сценарий. Я также пробовал много других вариантов (с su или передачей rcfile), но ни один из них, похоже, не работает.

Как мне с этим справиться?

0
03.06.2017, 23:56
2 ответа

Вы можете выполнить это как:

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

Если вам нужно запустить несколько команд, лучше всего поместить их в сценарий, как я предложил вчера в комментарии к моему ответу.

0
28.01.2020, 02:45

У вас есть команда 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.

1
28.01.2020, 02:45

Теги

Похожие вопросы