Почему sudo -u root echo `whoami` не возвращает root?

11

Как вы используете 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
Cerin
источник
11
почему эхо whoami? Просто скажите sudo whoami .. возвращает root
Neo

Ответы:

26

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

sudo whoami

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

Фатальная ошибка
источник
2
Это не верно. sudo работает с правами root, но не как root.
Манфред Мозер
@ Moser, тогда почему его команда выводит "root"?
Серин
4
@ManfredMoser: Он работает с УИД 0(ноль), которая является именно то , что люди называют «корень». (Вы были бы правы, если бы sudoтолько расширили свои возможности без фактического изменения UID. Но это не то, что он делает.)
user1686
1
М. Мозер, возможно , обращал внимание на то, что set-UID изменяет только эффективный идентификатор пользователя процесса, требуя, чтобы сам процесс затем изменил действительный идентификатор пользователя, как это и sudoпроисходит на самом деле . Но после прочтения xyr ответа, похоже, это не так.
JdeBP
7

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

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
источник
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-пользователями и поэтому не должен использоваться.

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

Манфред Мозер
источник
6
Нет. То, что объясняет поведение, является очень простым вопросом о том, как работает подстановка команд в оболочке. Это никак не связано с привилегиями.
JdeBP
-2

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

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

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

Тони Хопкинсон
источник
Рут заблокирован в Ubuntu? Вы уверены, что? Я знаю, что это обескураживает, но я подумал, что они только немного усложнили для новичка, фактически установив непонятный пароль, используя UUID, который можно изменить обычными методами.
Марти Фрид