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 无权访问该文件,因此重定向失败。