`sudo echo" bla ">> / etc / sysctl.conf` autorisation refusée

16

Avertissement: je suis assez novice dans le domaine des administrateurs système.

J'essaie de configurer la redirection de port dans une instance AWS EC2, cela doit être fait dans la ligne de commande parce que je ne veux pas entrer et éditer quoi que ce soit, cela doit être automatique (cela fait partie d'un processus de construction ).

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

Permission refusée

Ce qui est étrange, c'est que j'utilise (avec succès) sudopresque toutes les commandes qui nécessitent des suprivilèges. Si je fais sudo suavant la commande (l'essayer à la main dans une sshsession), alors cela fonctionne.

Pourquoi cela? Solutions possibles qui n'impliquent pas sudo suou modifications manuelles?

bevacqua
la source
Même problème ici: stackoverflow.com/questions/82256/… - Aussi, si vous voulez vraiment être risqué:sudo -i
MirroredFate

Réponses:

46

Vous ne pouvez pas utiliser sudopour affecter la redirection de sortie; >et >>(et, pour être complet <), sont effectuées avec le privilège de l'utilisateur appelant, car la redirection est effectuée par le shell appelant, et non par le sous-processus appelé.

Soit

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

ou

sudo /bin/su -c "echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf"
Chapelier Fou
la source
15

Vous trouverez peut-être plus simple d'utiliser cette commande:

echo net.ipv4.ip_forward = 1 | sudo tee -a /etc/sysctl.conf
Aléatoire832
la source
12

sudoexécute uniquement votre commande, pas la redirection, en tant que root. Vous aurez besoin de tout envelopper dans une commande où le tout s'exécute en tant que root:

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

La commande sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confest interprétée comme si vous (non root) écrivez le résultat de sudo echo "net.ipv4.ip_forward = 1"dans /etc/sysctl.conf.

Courir

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

ou

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

pour exécuter en echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conftant que root.

jdh8
la source
1
sudo sed -i "$ a <text>" <file>
  • -i : éditer le fichier sur place.
  • $ a: ajouter du texte à la dernière ligne

L'utilisation de la sedcommande vous évite les tracas des redirections et des pipelines.

Dans ton cas: sudo sed -i "$ a net.ipv4.ip_forward = 1" /etc/sysctl.conf

forzagreen
la source