在第一个命令上使用 && 和 sudo 时,第二个命令是否也作为 sudo 运行?

use*_*407 72 bash sudo

如果我运行一个命令。

sudo some-command && some-other-command
Run Code Online (Sandbox Code Playgroud)

第二个命令是否sudo也使用特权运行?

s3l*_*lph 120

TL;博士:没有


第一个命令是

sudo some-command
Run Code Online (Sandbox Code Playgroud)

第二个命令是

some-other-command
Run Code Online (Sandbox Code Playgroud)

该命令sudo采用以下命令并以提升的权限执行它。的&&,但是,不属于一个命令,并通过外壳的解释,执行第一命令之前。它告诉 bash 首先执行第一个命令,成功后执行第二个命令。

所以sudo不知道&& some-other command. 当提升的进程终止时,bash 获取其返回值,然后执行另一个命令,该命令同样不知道第一个命令。

这可以很容易地证明:

$ sudo whoami && whoami
root
username
Run Code Online (Sandbox Code Playgroud)

为了达到你想要的效果,你可以启动一个提升的 bash,让它执行两个命令:

$ sudo bash -c 'whoami && whoami'
root
root
Run Code Online (Sandbox Code Playgroud)

所以现在,这两个命令都以 root 身份执行,因为上面描述的整个过程是在一个提升的过程中执行的,即 bash 会话以这个命令开始,完成后立即退出。尽管如此,两人whoami都不知道对方的存在。

这不适合任何目的,但对于这个演示,更简单的方法是简单地做

sudo some-command && sudo some-other-command
Run Code Online (Sandbox Code Playgroud)


Rin*_*ind 20

不。一些这样做的例子是:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"
Run Code Online (Sandbox Code Playgroud)

或者如果你想要嵌套命令,你甚至可以这样做:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
Run Code Online (Sandbox Code Playgroud)
  • 第二个使用另一个外壳。
  • 请注意,当您在第二个版本中使用 ' 或 " 时,您需要对该命令的命令或参数(即 \' 或 \")中的那些进行转义,以便很快变得复杂。


dav*_*ann 5

不,要么你必须写两次 sudo,要么做类似的事情

sudo bash -c 'foo && bar'
Run Code Online (Sandbox Code Playgroud)