Answers:
为了说服自己sudo
仅使用提供的第一个命令运行,并且将第一个管道作为原始用户ID运行之后的所有其他操作,您可以使用此无用的命令链进行查看。
$ sudo whoami > file1 | whoami > file2 | whoami > file3
然后,当您使用cat
这些文件时,将看到以下用户名:
$ cat file{1..3}
root
saml
saml
但是,如果您运行一个子shell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
然后,当您使用cat
这些文件时,您将看到以下用户名:
$ cat file{4..6}
root
root
root
您对的评论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
。我在这里告诉他们只是为了不教别人,否则别人一定会去做!
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
这个怎么运作?
由于sudo,双引号内的echo程序将以root身份运行,但是将echo的输出重定向到仅root的文件的外壳仍在运行。您当前的外壳程序会在sudo
开始之前进行重定向。
$ sudo tee /proc/sys/vm/drop_caches <<<1
这个怎么运作?
此方法tee
以根用户身份运行程序,并从调用命令之前运行的here字符串获取输入。sudo
tee
# 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
)我们在其中“后门”运行命令字符串。
还有更多,但我会在这里停止。这些只是向您展示如果您了解事物后可以做的事情,但不一定要把垃圾链在一起,因为您可以,应该将代码杂乱性保持在合理的逻辑水平上,以便其他人都可以理解和支持他们将来。