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

Cer*_*rin 11 linux sudo ubuntu

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

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

myuser@localhost:~$ sudo -u root echo `whoami`
myuser
Run Code Online (Sandbox Code Playgroud)

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

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Run Code Online (Sandbox Code Playgroud)

Fat*_*ror 26

事实上,它确实以 root 身份运行它们。但是,发生在您身上的是 sudo运行之前正在评估反引号,因为它们需要评估命令。更直接,为什么不只是这个:

sudo whoami
Run Code Online (Sandbox Code Playgroud)

您的whoamiin back tick 实际上在子 shell 中作为当前用户进行评估,这就是为什么您会看到您所做的事情。

  • @ManfredMoser:它以`0`(零)的UID 运行,这*正是人们所说的“root”。(如果 `sudo` 只扩展其 [功能](http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.html) 而没有实际更改 UID,那你是对的. 但这不是它的作用。) (4认同)
  • 这是错误的。sudo 以 root 权限运行,但不是以 root 身份运行。 (2认同)

Kev*_*vin 7

子shell ( whoami) 像你一样首先执行,结果( myuser) 被放入sudo命令中;什么sudo看到的是echo myuser。将其视为以下操作的快捷方式:

tmpvar=`whoami`
sudo echo "$tmpvar"
Run Code Online (Sandbox Code Playgroud)


小智 2

sudo echo `whoami` 
Run Code Online (Sandbox Code Playgroud)

返回您的姓名,因为whoami在 sudo 运行之前更改了您的用户名。就像是:

sudo echo myname
Run Code Online (Sandbox Code Playgroud)

你可以看到这些代码:

myname@mypc:~$ whoami
myname

myname@mypc:~$ sudo whoami
root

myname@mypc:~$ echo `whoami`
myname

myname@mypc:~$ sudo echo `whoami`
myname

myname@mypc:~$ sudo `echo whoami`
root

myname@mypc:~$ sudo -i
[sudo] Password for myname: ******

root@mypc:~$ whoami
root

root@mypc:~$ echo `whoami`
root
Run Code Online (Sandbox Code Playgroud)

谢谢