Rediriger la sortie en utilisant 'sudo' [dupliquer]

27

J'ai une petite question concernant l'utilisation de sudo avec la redirection de sortie > . Pour activer le protocole IP, 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 refusée! Il semble que la redirection de sortie > n'hérite pas des autorisations de la commande précédente echo . Est-ce exact?

Solution de contournement:

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?

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

    
posée Khaled 08.01.2011 - 10:20
la source

3 réponses

26

Votre approche avec sudo tee va bien. Une bonne conséquence de l'utilisation de sudo tee est que la commande exécutée avant le tube ne sera pas exécutée 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 canal ( 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 équivaut à sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' avec 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 .

    
réponse donnée Lekensteyn 08.01.2011 - 12:03
la source
8

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 avec echo $PATH par exemple pour obtenir le même résultat que dans votre shell parent (bien sûr seulement si vous modifiez votre propriété path).

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

En outre, selon lien , vous feriez mieux d'utiliser sh (qui est un lien symbolique vers dash ), au lieu d’en appeler avec bash .

Vous pouvez donc réécrire ceci en tant que:

sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
    
réponse donnée Michal Bernhard 08.01.2011 - 10:50
la source
6

J'utilise généralement l'astuce sudo bash -c , ou faites d'abord sudo -s pour rester root, puis exécutez la commande de redirection.

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

    
réponse donnée psusi 08.01.2011 - 15:17
la source

Lire d'autres questions sur les étiquettes