web-dev-qa-db-fra.com

Rediriger la sortie en utilisant `Sudo`

J'ai une petite question concernant l'utilisation de Sudo avec la 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 l'erreur d'autorisation refusée! Il semble que la redirection de sortie > n'hérite pas des autorisations de la commande précédente echo. 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.

30
Khaled

Votre approche avec Sudo tee est correcte. L’utilisation de Sudo tee a pour conséquence agréable 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 ajouter 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.

29
Lekensteyn

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 propriété path). .

Utiliser Sudo -E préservera les variables d’environnement.

En outre, selon https://wiki.ubuntu.com/DashAsBinSh , vous feriez mieux 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'
8
Michal Bernhard

J'utilise habituellement l'astuce Sudo bash -c, ou je fais juste d'abord Sudo -s pour rester root, puis je lance 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 Sudoname__. Étant donné que votre shell n'a pas accès au fichier, la redirection échoue.

6
psusi