为什么“ sudo -u root echo`whoami`”不返回root?


11

您如何使用sudo在Ubuntu上以实际root用户身份运行命令?我最初以为这是sudo的默认行为,直到我运行:

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

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

但是,这是我想要的行为类型,但仅在一行中:

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

11
为什么回声whoami?只是说sudo whoami ..返回根源
2012年

Answers:


26

实际上,它确实以root用户身份运行它们。但是,您正在发生的事情是, sudo运行之前先评估了反向滴答声,因为它们是评估命令所必需的。更直接地,为什么不这样:

sudo whoami

whoami实际上,您的后壁虱是在子外壳中以当前用户身份进行评估的,这就是为什么看到您所做的事情的原因。


2
错了 sudo使用root特权运行,但不能以root身份运行。
曼弗雷德·摩泽

@Moser,那么为什么他的命令显示“ root”?
塞林2012年

4
@ManfredMoser:它与运行的UID 0(零),这正是人们所说的“根”。(如果sudo仅扩展其功能而不实际更改UID,那将是对的。但这不是它的功能。)
user1686'1

1
M. Moser 可能已经提出了关于set-UID的观点,即仅更改流程的有效用户ID,实际上要求流程本身随后要更改真实的用户ID sudo。但是从阅读xyr的答案来看,似乎并非如此。
JdeBP

7

whoami像您一样先执行子shell(),然后将结果(myuser)放入sudo命令中。什么sudo看到的是echo myuser。可以将其视为快捷方式:

tmpvar=`whoami`
sudo echo "$tmpvar"

1

这里似乎有一些推测……

反引号显然正在按照其他人的解释做,whoami在调用“ sudo”之前扩展,并且使反引号不返回“根”,正如预期的那样。

但是了解sudo(8)实际发生的事情很有用。所以我实际上看了手册页!

“实际有效的uid和gid设置为与目标用户的匹配”。

因此,似乎观察到的行为与有效用户ID和实际用户ID之间的差异无关。

做“ sudo printenv”并将其与“ printenv”进行比较也是说明性的,这实际上让我有些惊讶。它显示[i]一些[/ i]导出的变量可用而其他的则不可用:它报告调用用户的HOME,PATH,PS1,SHELL,TERM和EDITOR,但不报告诸如MANPATH,CVSROOT,LD_LIBRARY_PATH或ENV。这似乎有些奇怪,因为它可能导致程序的行为与原始用户或root用户不同。


0

sudo允许您以root特权运行任何命令,但不能以root用户身份运行。之所以有用,是因为使用此设置,多个人可以拥有root权限,而所有日志记录等仍然指示谁进行了更改。

此设置比共享root密码更好。因此,它已取代在包括Ubuntu在内的许多发行版中拥有root用户。

另一方面,sudo su使您成为root用户,因此不应真正使用它。

这种差异也可以解释您观察到的(正确)行为。


6
不能。解释此行为的方法很简单,就是如何在Shell中执行命令替换。与特权无关。
JdeBP

-2

Sudo临时授予您谁(首先是允许您使用sudo)根级特权。

要成为root用户,您必须以root用户身份登录,默认情况下,此用户在Ubuntu中被阻止。

您需要注意这一点,sudo不是root。如果要显示Fred正在以sudo身份执行某件事,请检查SUDO环境变量,则SUDO_COMMAND可能是最有用的。


根在Ubuntu中被阻止了吗?您确定吗?我知道不鼓励这样做,但是我认为他们通过使用UUID实际设置晦涩的密码(对于新密码可以使用常规方法进行更改),给新手增加了一点难度。
马蒂·弗里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.