Это сильно зависит от того, как вы называете свою программу с помощью sudo
или su
.
Например, в системе, в которой я нахожусь в данный момент:
.bashrc
COMMAND $HOME $USER Env. $PATH
1. sudo -i (root) root root [1]
2. sudo -s (USER) root USER /home/${USER}/bin:[1]
3. sudo /bin/bash (USER) root USER /home/${USER}/bin:[1]
4. sudo su (root) root USER [1]:/usr/games:/usr/local/games
5. sudo su - (root) root root [1]
Где [1] =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Env = переменные среды сбрасываются для 1 и 5, взяты из $ USER в 2,3,4.
Таким образом, скрипт или программа, запускаемая с другой опцией, может видеть разные $PATH
, $HOME
, его оболочка может читать разные переменные .bashrc
, .profile
и Environment. Он читает файл, связанный с $HOME
. Каждый пользователь может изменить свое окружение по-своему (переменные, $PATH
, .bashrc, .profile, .bash_profile, псевдоним ...). В частности, у пользователя может быть другой порядок каталогов в его $PATH
и, как следствие, сценарий может выполнить команду, например, в /home/$USER/bin
вместо той, которая находится в пути, ожидаемом от root.
Вы можете запустить программу с помощью sudo -i
поскольку вы вошли в систему как пользователь root с помощью su -
, но у вас может быть другое поведение, если вы запускаете ее с помощью sudo MyCommand
или su -c MyCommand
.
От man su
:
В части описания:
Текущее окружение передается новой оболочке. Значение $ PATH сбрасывается в /bin:/usr /bin для обычных пользователей или /sbin:/bin:/usr /sbin:/usr /bin для суперпользователя
...
В разделе опций:
-, -l, --login
Создайте среду, аналогичную той, которую пользователь ожидал бы при непосредственном входе в систему.
От человека sudo
-i, --login
Запустите оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа в систему. Это означает, что специфичные для входа файлы ресурсов, такие как .profile или .login, будут прочитаны оболочкой. Если указана команда, она передается в оболочку для выполнения через параметр оболочки -c. Если команда не указана, выполняется интерактивная оболочка. sudo
пытается перейти в домашний каталог этого пользователя перед запуском оболочки. Команда запускается в среде, аналогичной той, которую пользователь получит при входе в систему. В разделе «Командная среда» руководства sudoers(5) описано, как параметр -i влияет на среду, в которой выполняется команда, когда используется политика sudoers.