Rediriger la sortie en utilisant `sudo`

J’ai une petite question concernant l’utilisation de sudo avec une redirection de sortie > . Pour activer IP forwrding, quelqu’un peut utiliser la commande:

 echo 1 > /proc/sys/net/ipv4/ip_forward 

L’exécution de cette commande donnera une autorisation refusée car elle nécessite des privilèges root. Cependant, l’exécution de la même commande avec sudo donne également une erreur d’autorisation refusée! Il semble que la redirection de sortie > n’hérite pas des permissions de l’ echo commande précédente. Est-ce correct?

Comme solution de contournement je fais:

 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward 

Est-ce la meilleure façon de le faire? Est-ce que je manque quelque chose?

Notez que ceci est un exemple et qu’il s’applique à toutes les commandes qui utilisent la redirection de sortie.

Votre approche avec sudo tee est très bien. L’utilisation de sudo tee conséquence intéressante que la commande exécutée avant le tube ne s’exécutera pas en tant que root. C’est utile si vous avez juste besoin de la sortie d’un programme, qui ne nécessite pas de privilèges root.

Si vous ne vous souciez pas de la sortie du programme utilisé avant le tube ( echo 1 dans ce cas), redirigez stdout vers /dev/null :

 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null 

Ce qui précède est équivalent à sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' à la différence que echo 1 est exécuté en tant que root.

Si vous devez append un fichier privilégié, vous pouvez utiliser sh -c 'echo 127.0.0.1 local.host >> /etc/hosts' ou:

 echo 127.0.0.1 local.host | sudo tee -a /etc/hosts 

Notez le -a qui est un raccourci pour --append .

Une solution consiste à utiliser:

 sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' 

mais celui-ci n’hérite pas des propriétés env du shell parent, vous ne pouvez donc pas l’utiliser par exemple avec echo $PATH pour obtenir le même résultat que dans votre shell parent (bien sûr uniquement si vous modifiez votre chemin propriété) .

L’utilisation de sudo -E préservera les variables d’environnement.

En outre, selon https://wiki.ubuntu.com/DashAsBinSh , il serait préférable d’utiliser sh (qui est un lien symbolique vers dash ), au lieu de l’invoquer avec bash .

Donc, vous pourriez réécrire ceci en tant que:

 sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' 

J’utilise habituellement le truc sudo bash -c , ou tout simplement faire d’abord sudo -s pour restr root, puis exécuter la commande de redirection.

La première raison pour laquelle cela ne fonctionne pas est que le shell traite d’abord la redirection, puis exécute sudo . Comme votre shell n’a pas access au fichier, la redirection échoue.