В чем разница в привилегиях между sudo и sudo -i?
С участием sudo
его
$sudo echo "search foo.bar.baz" >> /etc/resolv.conf
bash: /etc/resolv.conf: Permission denied
...и с sudo -i
$sudo -i
#echo "search foo.bar.baz" >> /etc/resolv.conf
...оно работает. Привилегии:
drwxr-xr-x 166 root root 12288 2009-10-17 21:02 .
-rw-r--r-- 1 root root 42 2009-10-17 20:55 /etc/resolv.conf
Меня удивило то, что эти команды ведут себя по-разному, из-за чего sudo
версия не удалась?
В первом примере перенаправление происходит в вашей текущей оболочке, а не в подоболочке sudo. Так sudo
выполняет echo "search foo.bar.baz"
и возвращая результат вашей текущей оболочке, которая затем пытается записать его в /etc/resolv.conf
.
Вы можете заставить работать первый пример, вызвав bash
прямо как ваша команда sudo:
sudo bash -c "echo 'search foo.bar.baz' >> /etc/resolv.conf"
Из справочной страницы sudo:
-i The -i (simulate initial login) option runs the shell specified in
the passwd(5) entry of the user that the command is being run as.
The command name argument given to the shell begins with a ‘-’ to
tell the shell to run as a login shell. sudo attempts to change to
that user’s home directory before running the shell. It also ini‐
tializes the environment, leaving TERM unchanged, setting HOME,
SHELL, USER, LOGNAME, and PATH, and unsetting all other environment
variables. Note that because the shell to use is determined before
the sudoers file is parsed, a runas_default setting in sudoers will
specify the user to run the shell as but will not affect which
shell is actually run.
Проблема в том, что оболочка применяет sudo только к первой части созданного вами конвейера. В >> etc
работает с вашими разрешениями, а не с правами root.
С участием sudo
вы можете использовать 1 команду с правами администратора.
С участием sudo -i
вы входите в учетную запись root с его собственными переменными оболочки и среды.
В противном случае вы можете использовать sudo -s
, с его помощью вы входите в учетную запись root, но вы остаетесь со своей оболочкой и переменными.
Дело в том, что с sudo -i
вы можете получить другую оболочку и другую переменную $ PATH, которая может решить проблему.