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.
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
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.
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.
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:
tee
car non /dev/null
redirectionsh
car aucun sous-shelldd
possède de nombreuses options puissantes, par exemple status=progress
pour voir la progression du transfertFonctionne car Sudo transmet stdin à la commande.