使用`sudo`重复定向输出

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

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

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

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

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

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

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

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

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

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

以上相当于sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' ,区别在于echo 1以root身份运行。

如果需要附加到特权文件,可以使用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简写。

一种解决方案是使用:

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

但是这个没有从父shellinheritanceenv属性,所以你不能使用它来例如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' 

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

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