`sudo echo "bla" >> /etc/sysctl.conf` 权限被拒绝

`sudo echo "bla" >> /etc/sysctl.conf` 权限被拒绝

免责声明:我对系统管理方面还很陌生。

我正在尝试在 AWS EC2 实例中设置端口转发,这必须在命令行中完成,因为我不想进入并编辑任何内容,它必须是自动的(它是构建过程的一部分)。

sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

没有权限

奇怪的是,我sudo几乎成功使用了所有需要su特权的命令。如果我sudo su在命令之前执行此操作(在会话中手动尝试ssh),那么它就会起作用。

sudo su这背后的原因是什么?有没有不涉及手动编辑的可能解决方案?

答案1

您不能使用sudo来影响输出重定向;>并且>>(并且,为了完整性,<)受调用用户的权限影响,因为重定向是由调用 shell 完成的,而不是被调用的子进程。

要么

cp /etc/sysctl.conf /tmp/
echo "net.ipv4.ip_forward = 1" >> /tmp/sysctl.conf
sudo cp /tmp/sysctl.conf /etc/

或者

sudo /bin/su -c "echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf"

答案2

您可能会发现使用此命令更简单:

echo net.ipv4.ip_forward = 1 | sudo tee -a /etc/sysctl.conf

答案3

sudo仅以 root 身份运行命令,而不是重定向。您需要将其全部包装在一个命令中,让整个命令以 root 身份运行:

sudo sh -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'

答案4

sudo sed -i "$ a <text>" <file>
  • -i :就地编辑文件。
  • $ a:将文本附加到最后一行

使用sed命令可以避免重定向和管道的麻烦。

就你的情况而言:sudo sed -i "$ a net.ipv4.ip_forward = 1" /etc/sysctl.conf

相关内容