Назад | Перейти на главную страницу

sudo и sudo -i функции доступа

В чем разница в привилегиях между 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, которая может решить проблему.