Comment exécuter une commande impliquant une redirection ou une tuyauterie avec sudo?

60

J'essaie de suivre ce que je suppose est la meilleure pratique consistant à utiliser sudo au lieu d'un 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 à droite du ">>" en tant qu'utilisateur normal. L'ajout de plus de sudos échoue également (comportement attendu depuis la tuyauterie à la commande sudo et non au fichier).

Cet exemple est juste mais il a été vérifié et testé sous le compte root.

DarkSheep
la source

Réponses:

75

Vous pouvez appeler un nouveau shell en tant que root:

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

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

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
Chris Down
la source
8
En général, la deuxième option est plus sûre car seules les teecommandes sont exécutées en tant que root, et non la commande principale, qui pourrait être complexe et sujette à des erreurs de comportement. (pas le cas de echo)
pabouk
19

Une autre option, tout aussi sûre, consiste à utiliser sudole -icommutateur pour se connecter en tant que root:

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

Cela suit toujours les meilleures pratiques car le compte root n'est pas 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. 
terdon
la source
Une autre alternative estsudo bash
starbeamrainbowlabs
11

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 l'exécuter en tant que root:

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

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

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

Puis invoquer sudo sh -c …:

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

Sinon, pour écrire la sortie dans un fichier que seule la racine peut écrire, appelez-la sudo tee. Passez l' -aoption à teeajouter au fichier de destination, sinon le fichier est tronqué.

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

Pour les modifications des fichiers plus complexes, vous pouvez appeler sudo sed, sudo ed, sudo perl, ...

Sinon, utilisez un éditeur correct et appelez-le sudo. Dans Emacs, ouvrez /sudo:/etc/conf.d/hwclock. Dans Vim, appelez :w !sudo tee %pour écrire dans le fichier ouvert en tant que root ou utilisez le plugin sudo.vim . Ou aller du sudo et appeler sudoedit /etc/conf.d/hwclock.

Ou vous pouvez céder du côté obscur et lancer un shell en tant que root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Gilles, arrête de faire le mal
la source
5

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

Vous devrez vous assurer que c'est la racine qui ouvre le fichier en écriture.

Le moyen le plus simple de faire cela:

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

Le echopeut être exécuté comme un utilisateur ordinaire, car il ne produit qu'une chaîne de texte. L' teeutilitaire devra cependant être exécuté en tant que root et tee -aajouter des données. Nous redirigeons la sortie /dev/nullcar 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 bashou n'importe quel shell qui comprend "here-strings":

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

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


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

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

Ici, la redirection s'effectue dans un sh -cshell enfant s'exécutant en tant que root.

Kusalananda
la source
4

sudo dd of=

Ajouter comme vous voulez:

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 teedepuis aucune /dev/nullredirection
  • plus agréable que shdepuis pas de sous-coque
  • dddispose de nombreuses options puissantes, par exemple status=progresspour voir les progrès du transfert

Fonctionne parce que sudo transmet stdin à la commande.

Ciro Santilli 改造 中心 六四 事件
la source