Comment ajouter une ligne à un fichier qui n'a que la permission d'écriture root et continuer l'exécution du script

9

J'essaie d'apprendre le script bash. Je travaille sur un problème pratique et à un moment donné, je dois ajouter une ligne à un fichier qui nécessite l' rootautorisation d'écrire.

Le code ressemble à ceci:

# some code
echo "add this line to the code" >> fileName
# some code

Est-il possible de faire en sorte que le script demande le mot de passe root, de valider le mot de passe et de modifier le fichier en cas d'authentification réussie? Le script doit ensuite revenir en mode utilisateur et poursuivre l'exécution de la commande.

Alex
la source

Réponses:

13

Il y a une astuce dans la sudopage de manuel qui explique comment faire quelque chose comme ça. Voici mon one-liner:

#!/usr/bin/bash
sudo sh -c "echo \"add this line to the code\" >> fileName"

Évidemment, vous devrez d'abord configurer votre utilisateur pour qu'il ait des sudoprivilèges. Le shshell est utilisé en raison de la redirection vers le fichier appartenant à la racine. J'ai également dû échapper aux citations utilisées pour la echocommande.

SigueSigueBen
la source
2

su est disponible sur la plupart des systèmes Unix et devrait fonctionner:

su root -c 'echo "add this line to the code" >> fileName'
miracle173
la source
Contrairement à avec sudo, les mots de passe ne semblent pas être mis en cache avec su.
Ryne Everett
@Ryne Everett: Je ne connais pas sudo. Mais le comportement de 'su' est en fait tel que requis par le script de l'OP. La plupart du temps, j'utilise «su» dans l'autre sens: passer de root à un autre utilisateur. Dans ce cas, aucun mot de passe n'est nécessaire.
miracle173
1

Vous pouvez utiliser teeavec sudo:

echo "add this line to the code" | sudo tee -a filename > /dev/null

echoLa sortie de est redirigée avec |( pipe ) vers sudo tee. teelit à partir de l'entrée standard et écrit dans la sortie standard tout fichier donné, dans ce cas filename. -a(ou --append) fait teeajouter des fichiers, sans cela les fichiers seraient écrasés. Comme il teeest exécuté avec, sudoil ouvre des fichiers avec des autorisations root. Enfin, > /dev/nullsupprime teela sortie de la sortie standard .

Un avantage d'utiliser teeau lieu de simplement démarrer la commande entière, y compris la redirection avec su -cou, sudo sh -cest que vous n'avez pas à modifier la citation de la commande initiale de quelque manière que ce soit (les lignes de citation contenant déjà des guillemets peuvent parfois être assez laides).

Adaephon
la source
0

Essayez ceci Cette commande est disponible sur Unix et Linux.

sudo sh -c "echo 'add this line to the code' >> fileName"

JongYoung
la source
-2

Ferait l'affaire:

ssh host "sudo su root -c 'echo "add this line to the code" >> /etc/hosts'"
user1934677
la source
Pourquoi ssh? Vous n'avez pas besoin sude sudoni de spécifier rootcar c'est la valeur par défaut. Dans l'ensemble, un peu plus d'explications seraient bien car l'OP voulait apprendre quelque chose et pas seulement un problème résolu.
Adaephon
Je pense que vous rencontrerez des problèmes avec vos guillemets doubles
miracle173