免责声明:我对系统管理方面还很陌生。
我正在尝试在 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