`sudo echo“ bla ”>> / etc / sysctl.conf` отказано

16

Отказ от ответственности: я довольно новичок в материалах сисадмина.

Я пытаюсь настроить переадресацию портов в экземпляре AWS EC2, это должно быть сделано в командной строке, потому что я не хочу входить и редактировать что-либо, это должно быть автоматическим (это часть процесса сборки ).

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

В доступе отказано

Странная вещь, которую я (успешно) использовал sudoпочти для каждой команды, которая требовала suпривилегий. Если я делаю sudo suперед командой (пробуя это вручную в sshсеансе), то это работает.

Причины этого? Возможные решения, которые не включают sudo suили ручное редактирование?

bevacqua
источник
Та же проблема здесь: stackoverflow.com/questions/82256/… - Кроме того, если вы хотите быть очень рискованным:sudo -i
MirroredFate

Ответы:

46

Вы не можете использовать, sudoчтобы повлиять на перенаправление вывода; >и >>(и, для полноты <), выполняются с привилегией вызывающего пользователя, потому что перенаправление выполняется вызывающей оболочкой, а не вызываемым подпроцессом.

Либо сделать

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"
Безумный Шляпник
источник
15

Возможно, вам будет проще использовать эту команду:

echo net.ipv4.ip_forward = 1 | sudo tee -a /etc/sysctl.conf
Random832
источник
12

sudoзапускает только вашу команду, а не редирект, как root. Вам нужно будет обернуть все это в команду, где все работает как root:

sudo sh -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'
Cakemox
источник
3

Команда sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confинтерпретируется так, что вы (не root) записываете результат sudo echo "net.ipv4.ip_forward = 1"в /etc/sysctl.conf.

Бегать

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

или

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

запускать echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confот имени root.

jdh8
источник
1
sudo sed -i "$ a <text>" <file>
  • -i : редактировать файл на месте.
  • $ a: добавить текст в последнюю строку

Использование sedкоманды позволяет избежать хлопот перенаправлений и конвейеров.

В твоем случае: sudo sed -i "$ a net.ipv4.ip_forward = 1" /etc/sysctl.conf

forzagreen
источник