我有一个关于使用sudo
with output redirect的小问题>
。要启用 IP 转发,有人可以使用以下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
执行此命令将授予权限,因为它需要 root 权限。但是,执行相同的命令sudo
也会给出权限被拒绝的错误!输出重定向>
似乎没有继承前面命令的权限echo
。这是正确的吗?
作为一种解决方法,我这样做:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
这是最好的方法吗?我错过了什么吗?
请注意,这是一个示例,它适用于所有使用输出重定向的命令。
你的方法
sudo tee
很好。使用的一个很好的结果sudo tee
是在管道之前执行的命令不会以 root 身份运行。如果您只需要不需要 root 权限的程序的输出,这将非常有用。如果您不关心管道之前使用的程序的输出(
echo 1
在这种情况下),请将 stdout 重定向到/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'
或:注意
-a
which 是--append
.一种解决方案是使用:
但是这个不会从父 shell 继承 env 属性,因此您不能使用它
echo $PATH
来获得与父 shell 中相同的结果(当然只有在您更改路径属性的情况下)。使用
sudo -E
将保留环境变量。此外,根据https://wiki.ubuntu.com/DashAsBinSh,您最好使用
sh
(这是 的符号链接dash
),而不是使用bash
.因此,您可以将其重写为:
我通常使用这个
sudo bash -c
技巧,或者只是sudo -s
先保持root,然后运行重定向命令。第一种方式不起作用的原因是 shell 先处理重定向,然后运行
sudo
. 由于您的 shell 无权访问该文件,因此重定向失败。