使用“sudo”重定向输出

使用“sudo”重定向输出

sudo我对使用输出重定向有一个小问题>。要启用 IP 转发,可以使用以下命令:

echo 1 > /proc/sys/net/ipv4/ip_forward

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

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

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

这是最好的方法吗?我遗漏了什么吗?

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

答案1

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

如果您不关心管道之前使用的程序的输出(echo 1在本例中),将 stdout 重定向到/dev/null

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null

以上操作与以 root 身份运行的sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'操作相同,不同之处在于:echo 1

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

echo 127.0.0.1 local.host | sudo tee -a /etc/hosts

请注意,-a这是的简写--append

答案2

一种解决方案是使用:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

但是这个不会从父shell继承环境属性,所以你不能使用它来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'

答案3

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

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

相关内容