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

Mik*_*e B 10 shell bash sudo

如果我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 运行,您可以使用这个无用的命令链来查看它。

示例#1

$ 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)

示例#2

但是,如果您运行子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)

示例 #3

您的评论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 的晦涩方法

这些不是我最好的作品,而是您可能已经看到我使用sudo. 我在这里展示它们只是为了教导而不是为了让其他人一定会这样做

方式#1

$ 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启动之前会进行重定向。

方式#2

$ sudo tee /proc/sys/vm/drop_caches <<<1
Run Code Online (Sandbox Code Playgroud)

这个怎么运作?

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

方式#3

# 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),我们在其中“后门”我们要运行的命令字符串。

还有更多,但我会停在这里。这些只是为了向您展示如果您理解事物,您可以做什么,但不一定只是将垃圾链接在一起,因为您可以,您应该尝试将代码编译指示保持在合理的逻辑级别,以便其他人可以理解和支持他们在未来。


jor*_*anm 6

不,在您的示例中仅foosudo. 如果要以升级的权限运行所有命令,可以生成一个 shell:

sudo sh -c 'foo | foo2 | foo3'
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3085 次

最近记录:

12 年,2 月 前