web-dev-qa-db-fra.com

Comment exécuter une commande qui implique une redirection ou un piping avec sudo?

J'essaie de suivre ce que je suppose être les meilleures pratiques d'utilisation de Sudo au lieu du compte root.

J'exécute une opération de fichier concat simple telle que:

Sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Cela échoue quant à la droite du ">>" qu'il exécute en tant qu'utilisateur normal. L'ajout de sudos supplémentaires échoue également (comportement attendu depuis le raccordement à la commande Sudo et non au fichier).

L'exemple est juste cela, mais il a été vérifié et testé sous le compte root.

67
DarkSheep

Vous pouvez invoquer un nouveau Shell en tant que root:

Sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Vous pouvez également simplement élever un processus pour écrire dans le fichier:

Sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
85
Chris Down

Une autre option, tout aussi sûre, consiste à utiliser Sudo's -i basculez pour vous connecter en tant que root:

$ Sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Cela suit toujours les règles de bonnes pratiques car le compte root n'est pas réellement activé en tant que tel mais vous permet de faire les choses en tant que root en toute sécurité. De man Sudo:

The -i (simulate initial login) option runs the Shell
    specified by the password database entry of the target user
    as a login Shell.  This means that login-specific resource
    files such as .profile or .login will be read by the Shell.
    If a command is specified, it is passed to the Shell for
    execution via the Shell's -c option.  If no command is
    specified, an interactive Shell is executed. 
20
terdon

Si vous exprimez votre commande sans guillemets simples, vous pouvez la mettre entre guillemets simples et l'exécuter via un shell intermédiaire.

Pour exécuter ceci en tant que root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Écrivez la commande d'une manière différente qui n'utilise pas ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Appelez ensuite Sudo sh -c …:

Sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Sinon, pour écrire la sortie dans un fichier que seul root peut écrire, appelez Sudo tee. Passe le -a option à tee à ajouter au fichier de destination, sinon le fichier est tronqué.

echo 'clock_hctosys="YES"' | Sudo tee -a /etc/conf.d/hwclock >/dev/null

Pour des modifications de fichiers plus complexes, vous pouvez appeler Sudo sed, Sudo ed, Sudo Perl,…

Alternativement, utilisez un éditeur décent et faites-le appeler Sudo. Dans Emacs, ouvrez /Sudo:/etc/conf.d/hwclock. À Vim, appelez :w !Sudo tee % pour écrire dans le fichier ouvert en tant que root, ou utilisez le plugin Sudo.vim . Ou allez de l'extrémité Sudo et appelez sudoedit /etc/conf.d/hwclock.

Ou vous pouvez céder au côté obscur et exécuter un Shell en tant que root.

$ Sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

La commande échoue en raison des autorisations sur le fichier redirigé vers. La redirection se produit avant même que la commande Sudo soit invoquée.

Vous devrez vous assurer que c'est root qui ouvre réellement le fichier pour l'écriture.

La façon la plus simple de le faire:

echo 'clock_hctosys="YES"' | Sudo tee -a /etc/conf.d/hwclock >/dev/null

echo peut être exécuté en tant qu'utilisateur ordinaire car il produit simplement une chaîne de texte. L'utilitaire tee devra cependant s'exécuter en tant que root et tee -a ajoutera des données. Nous redirigeons la sortie vers /dev/null car tee, par défaut, dupliquera ses données d'entrée sur sa sortie standard en plus d'écrire dans les fichiers indiqués.

Avec bash ou tout autre shell qui comprend "ici-chaînes":

Sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Ceci est en effet identique à ce qui précède. Seule la façon dont nous produisons la chaîne est modifiée.


Une autre façon de faire, légèrement détournée:

Sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Ici, la redirection se produit dans un sh -c Shell enfant s'exécutant en tant que root.

6
Kusalananda

Sudo dd of=

Pour ajouter comme vous le souhaitez:

echo inbytes | Sudo dd of=outfile oflag=append conv=notrunc

ou pour recréer le fichier à partir de zéro:

echo inbytes | Sudo dd of=outfile

Avantages:

  • plus agréable que tee car non /dev/null redirection
  • plus agréable que sh car aucun sous-shell
  • dd possède de nombreuses options puissantes, par exemple status=progress pour voir la progression du transfert

Fonctionne car Sudo transmet stdin à la commande.