10

Как вы используете sudo для запуска команды от имени пользователя root в Ubuntu? Сначала я думал, что это стандартное поведение sudo, пока я не запустил:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Тем не менее, это тип поведения, который я хочу, но только в одной строке:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root

5 ответов5

26

На самом деле это не запускать их как корень. Но с вами происходит то, что обратные тики оцениваются до sudo , поскольку они необходимы для оценки команды. Более прямо, почему бы не просто так:

sudo whoami

Ваш whoami в обратном тике фактически оценивается в подоболочке как текущий пользователь, поэтому вы видите, что делаете.

7

Подоболочка (whoami) выполняется сначала, как и вы, а результат (myuser) помещается в команду sudo ; то, что видит sudo - это echo myuser . Думайте об этом как ярлык для:

tmpvar=`whoami`
sudo echo "$tmpvar"
1

Кажется, здесь происходит некоторое предположение ...

Очевидно, что обратные пометки делают то, что объяснили другие, расширяют whoami прежде чем вызывать sudo, и убирают обратные пометки, возвращая root, как и ожидалось.

Но полезно понять, что на самом деле происходит с sudo(8). Так что я на самом деле посмотрел справочную страницу!

«Реальный и эффективный uid и gid настроены так, чтобы соответствовать целевому пользователю…»

Таким образом, похоже, что наблюдаемое поведение не имеет ничего общего с разницей между эффективным и реальным идентификатором пользователя.

Также показательно сделать "sudo printenv" и сравнить с просто "printenv", что на самом деле меня немного удивило. Он показывает, что [i] некоторые [/i] экспортируемые переменные доступны, а другие нет: он сообщает о вызывающем пользователе HOME, PATH, PS1, SHELL, TERM и EDITOR, но не о других, таких как MANPATH, CVSROOT, LD_LIBRARY_PATH или ENV. Это кажется немного странным, так как это может привести к тому, что программы будут вести себя не так, как первоначальный пользователь или пользователь root.

0

sudo позволяет запускать любую команду с правами root, но не как пользователь root. Причина, по которой это полезно, заключается в том, что при такой настройке несколько человек могут иметь права root, но все записи в журнал и т.д. Все еще указывают, кто внес изменения.

Эта настройка лучше, чем разделение корневых паролей. В качестве такового он заменил наличие корневых пользователей во многих дистрибутивах, включая Ubuntu.

С другой стороны, sudo su делает вас root-пользователями и поэтому не должен использоваться.

Эта разница также объясняет ваше наблюдаемое (правильное) поведение.

-2

Sudo временно предоставляет всем, кем вы являетесь (если вам разрешено sudo в первую очередь) привилегии корневого уровня.

Чтобы стать пользователем root, вам необходимо войти в систему как пользователь root, который по умолчанию заблокирован в Ubuntu.

Вы должны быть осторожны с этим, sudo не root. Если вы хотите показать, что Fred выполняет что-то как sudo, проверьте переменные окружения SUDO, SUDO_COMMAND может быть наиболее полезным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .