如果我sudo在 bash 中的单行开头键入,它是否适用于其余命令?
换句话说,是这样的:
sudo foo | foo2 | foo3
Run Code Online (Sandbox Code Playgroud)
相当于:
sudo foo | sudo foo2 | sudo foo3
Run Code Online (Sandbox Code Playgroud)
slm*_*slm 11
作为一种说服自己sudo只使用提供的第一个命令运行的方法,以及第一个管道之后的所有其他内容作为您的原始用户 ID 运行,您可以使用这个无用的命令链来查看它。
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Run Code Online (Sandbox Code Playgroud)
然后,当您使用cat这些文件时,您将看到以下用户名:
$ cat file{1..3}
root
saml
saml
Run Code Online (Sandbox Code Playgroud)
但是,如果您运行子shell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Run Code Online (Sandbox Code Playgroud)
然后,当您使用cat这些文件时,您将看到以下用户名:
$ cat file{4..6}
root
root
root
Run Code Online (Sandbox Code Playgroud)
您的评论sudo foo1 | sudo foo2 ...永远不会起作用,因为来自的输出sudo foo1将被馈送到sudo foo2. 使用我的whoami示例,这表明该命令链什么都不做。
$ sudo whoami | sudo whoami | sudo whoami
root
Run Code Online (Sandbox Code Playgroud)
第一个跑了,但第二个和第三个什么都不做,因为他们没有准备好接受输入。相反,我认为你打算写这样的东西:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
Run Code Online (Sandbox Code Playgroud)
这相当于在 3 个不同的命令提示符下运行它 3 次。或这个:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Run Code Online (Sandbox Code Playgroud)
但永远不要做最后一个。它属于下一节。
这些不是我最好的作品,而是您可能已经看到我使用sudo. 我在这里展示它们只是为了教导而不是为了让其他人一定会这样做!
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?
由于 sudo,双引号内的 echo 程序以 root 身份运行,但是将 echo 的输出重定向到 root-only 文件的 shell 仍在以您的身份运行。您当前的 shell 在sudo启动之前会进行重定向。
$ sudo tee /proc/sys/vm/drop_caches <<<1
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?
此方法tee以 root 身份运行程序,并从调用命令之前运行的here 字符串获取输入。sudotee
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?
这些可能看起来不同,但它们实际上在做同样的事情。使用-s开关时,sudo将运行单个命令。我永远不知道是否有办法摆脱它。没有这样的东西会起作用。
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Run Code Online (Sandbox Code Playgroud)
但是在查看手册页时,-s开关说它将向在用户的/etc/passwd文件条目中定义的shell 传递一个命令。所以我们在第二种形式中使用了一个技巧,主要是传递 shell,另一个 shell ( sh -c),我们在其中“后门”我们要运行的命令字符串。
还有更多,但我会停在这里。这些只是为了向您展示如果您理解事物,您可以做什么,但不一定只是将垃圾链接在一起,因为您可以,您应该尝试将代码编译指示保持在合理的逻辑级别,以便其他人可以理解和支持他们在未来。
不,在您的示例中仅foo由sudo. 如果要以升级的权限运行所有命令,可以生成一个 shell:
sudo sh -c 'foo | foo2 | foo3'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |