如果我在一个衬里的开头键入“ sudo”,它是否适用于其余命令?


10

如果我sudo在bash中的一个衬纸的开头键入内容,它是否适用于其余命令?

换句话说,是这样的:

sudo foo | foo2 | foo3

等效于此:

sudo foo | sudo foo2 | sudo foo3

Answers:


11

为了说服自己sudo仅使用提供的第一个命令运行,并且将第一个管道作为原始用户ID运行之后的所有其他操作,您可以使用此无用的命令链进行查看。

例子1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

然后,当您使用cat这些文件时,将看到以下用户名:

$ cat file{1..3}
root
saml
saml

范例#2

但是,如果您运行一个子shell:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

然后,当您使用cat这些文件时,您将看到以下用户名:

$ cat file{4..6}
root
root
root

例子#3

您对的评论sudo foo1 | sudo foo2 ...将永远无法执行,因为的输出sudo foo1将被馈送到sudo foo2。使用我的whoami示例,这表明该命令链没有任何作用。

$ sudo whoami | sudo whoami | sudo whoami
root

第一个跑了,但是第二个和第三个没有做任何事情,因为他们没有能力接受输入。相反,我认为您的意思是写这样的东西:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

这等效于在3个不同的命令提示符下运行3次。或这个:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

但是永远不要最后一遍。它属于下一部分。

调用sudo的晦涩方式

这些不是我的最佳工作,而是您可能已经看到我使用执行多个命令的其他方式sudo。我在这里告诉他们只是为了不别人,否则别人一定会去做

方式1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

这个怎么运作?

由于sudo,双引号内的echo程序将以root身份运行,但是将echo的输出重定向到仅root的文件的外壳仍在运行。您当前的外壳程序会在sudo开始之前进行重定向。

方式#2

$ sudo tee /proc/sys/vm/drop_caches <<<1

这个怎么运作?

此方法tee以根用户身份运行程序,并从调用命令之前运行的here字符串获取输入。sudotee

方式3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

这个怎么运作?

这些看上去可能不同,但实际上它们在做相同的事情。使用-s开关时,sudo将运行单个命令。我永远不知道是否有办法逃脱它。像这样的东西是行不通的。

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

但是在查看手册页时,该-s开关表示它将将单个命令传递给/etc/passwd文件用户条目中定义的外壳程序。因此,我们在第二种形式中使用了一个技巧,主要是传递外壳程序,另一个外壳程序(sh -c)我们在其中“后门”运行命令字符串。

还有更多,但我会在这里停止。这些只是向您展示如果您了解事物后可以做的事情,但不一定要把垃圾链在一起,因为您可以,应该将代码杂乱性保持在合理的逻辑水平上,以便其他人都可以理解和支持他们将来。


6

不,在您的示例中仅foo由执行sudo。如果要使用提升的权限运行所有命令,则可以生成一个shell:

sudo sh -c 'foo | foo2 | foo3'
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.