使用 `sudo` 重定向输出

Kha*_*led 35 command-line sudo

我有一个关于使用sudowith output redirect的小问题>。要启用 IP 转发,有人可以使用以下命令:

echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

执行此命令将拒绝权限,因为它需要 root 权限。但是,执行相同的命令sudo也会导致权限被拒绝错误!输出重定向>似乎没有继承前面命令的权限echo。这是正确的吗?

作为一种解决方法,我这样做:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?我错过了什么吗?

请注意,这是一个示例,它适用于所有使用输出重定向的命令。

Lek*_*eyn 37

你的方法sudo tee很好。使用的一个很好的结果sudo tee是管道之前执行的命令不会以 root 身份运行。如果您只需要不需要 root 权限的程序输出,这将非常有用。

如果您不关心管道之前使用的程序的输出(echo 1在这种情况下),请将stdout 重定向到/dev/null

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null
Run Code Online (Sandbox Code Playgroud)

以上等价于sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'echo 1root身份运行的区别。

如果您需要附加到特权文件,您可以使用sh -c 'echo 127.0.0.1 local.host >> /etc/hosts'或:

echo 127.0.0.1 local.host | sudo tee -a /etc/hosts
Run Code Online (Sandbox Code Playgroud)

请注意-awhich 是 的简写--append


Mic*_*ard 9

一种解决方案是使用:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Run Code Online (Sandbox Code Playgroud)

但是这个没有从父 shell 继承 env 属性,所以你不能使用它echo $PATH来获得与你在父 shell 中相同的结果(当然只有在你改变你的路径属性的情况下)。

使用sudo -E将保留环境变量。

此外,根据https://wiki.ubuntu.com/DashAsBinSh,您最好使用sh(这是 的符号链接dash),而不是使用bash.

因此,您可以将其重写为:

sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Run Code Online (Sandbox Code Playgroud)

  • 你不需要 bash 来完成这项工作,你最好使用 sh (符号链接到破折号)。有关这些之间的差异,请参阅 https://wiki.ubuntu.com/DashAsBinSh。 (2认同)
  • 使用“sudo -E”将保留环境变量。 (2认同)

psu*_*usi 6

我通常使用这个sudo bash -c技巧,或者只是sudo -s先保持 root,然后运行重定向命令。

第一种方式不起作用的原因是外壳首先处理重定向,然后运行sudo. 由于您的 shell 无权访问该文件,因此重定向失败。