问题描述
如果我运行命令。
sudo some-command && some-other-command
第二个命令是否也与sudo
一起运行?
最佳解决方法
长话短说:没有
第一个命令是
sudo some-command
第二个命令是
some-other-command
命令sudo
采用以下命令并使用提升的权限执行它。但是,在执行第一个命令之前,&&
不属于命令并由shell解释。它告诉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
次佳解决方法
不是。这样做的一些例子是:
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
-
第二个使用另一个shell。
-
请注意,当您在第二个版本中使用’或’时,您需要在该命令的命令或参数(即。\’或\“)中转义那些,以便可以非常快速地复杂化。
第三种解决方法
不,要么你必须写两次sudo,要么做类似的事情
sudo bash -c 'foo && bar'
第四种方法
&&
表示右侧(第二)命令仅在最小值(第一)命令成功时才运行,即退出代码$?
为0
。
这两个命令彼此不同,并且将在它们自己的环境中运行,因此第二个命令将不会运行具有sudo
权限。
这会让你清楚:
$ sudo whoami && whoami
root
foobar