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


64

如果我运行命令。

sudo some-command && some-other-command

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

Answers:


110

TL; DR:


第一个命令是

sudo some-command

第二个命令是

some-other-command

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

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

这很容易证明:

$ sudo whoami && whoami
root
username

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

$ sudo bash -c 'whoami && whoami'
root
root

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

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

sudo some-command && sudo some-other-command

29
whoami范例为+1 。
卡尔H


这个演示真的很棒!下次尝试向他人教授sudo时,请考虑一下!
需要

20

否。执行此操作的一些示例是:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

或者,如果您需要嵌套命令,甚至可以执行以下操作:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • 第二个使用另一个外壳。
  • 请注意,在第二版中使用'或'时,您需要转义该命令或该命令的参数(即\'或\“)中的内容,以免很快变得复杂。

第三种方法不起作用:$ sudo -s -- whoami && whoami给出root username
-BartekChom

@BartekChom对不起,我错过了那个报价
Rinzwind 2015年

sudo -s -- "whoami && whoami"似乎给出了未找到的命令,与command大致相同"whoami && whoami"。如何与&&一起使用此构造?我看到 sudo -s cd ..与相对没有错误sudo cd ..
BartekChom

我学到的东西今天新:sudo bash <<"EOF"!谢谢!:-)
Fabby 2015年


2

&&表示仅当最小指令(第一个)成功执行(即退出代码$?为)时,右侧(第二个)命令才会运行0

这两个命令彼此不同,并且将在各自的环境中运行,因此第二个命令将不会具有sudo特权运行。

这将使您清楚:

$ sudo whoami && whoami 
root
foobar

1

不,以下内容曾经很常见。

sudo reboot && exit

几乎每个人都应该至少这样做一次

sudo apt-get update && sudo apt-get upgrade

因此,这是一个很好的“米老鼠”面试问题。

这很容易测试,以至于统计填充练习可能会怀疑该问题。


0

在命令行上,当您看到

$ command one && command two

通常的意图是仅在第一个命令成功时才执行&&后面的命令。

另一个命令是否也以sudo运行?

绝对不行,这就像编写两个连续的命令一样,此&&不会给命令增加任何特权。这只是一个分隔符

为了证明这一点,让我们举一个例子。

touch fileA fileB 

我创建了两个文件fileA和fileB。现在我将运行命令

sudo chown test:test fileA && chown test:test fileB

我正在将这些文件的用户和组所有者更改为用户和组名称测试。现在,第一个命令应该运行,而另一个命令应该如何运行?

输出为:

chown: changing ownership of `fileB': Operation not permitted

因此该命令由于需要sudo而没有运行,尽管我们可以得出结论,&&不能替代第二个sudo

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.