116 votes

Comment utiliser su pour exécuter le reste du script bash en tant qu'utilisateur?

J'ai écrit un script qui prend comme argument une chaîne de caractères qui est une concaténation d'un nom d'utilisateur et d'un projet. Le script est censé switch (su) pour le nom d'utilisateur, cd-rom dans un répertoire spécifique basé sur le projet de chaîne.

En gros, je veux faire:

su $USERNAME;  
cd /home/$USERNAME/$PROJECT;  
svn update;  

Le problème est que une fois que je fais un su... elle n'attend que. Qui est logique, puisque le flux d'exécution est passé le passage à l'utilisateur. Une fois que j'ai sortie, puis le reste des choses exécuter, mais il ne fonctionne pas comme souhaité.

J'ai ajouté la ligue pour la commande svn mais l'échec de la commande (c'est à dire qu'il n'a pas de mise à jour svn dans le répertoire désiré).

Comment puis-je écrire un script qui permet à l'utilisateur de changer d'utilisateur et invoquer svn (entre autres choses)?

90voto

Dan Dascalescu Points 8165

Beaucoup plus simple: utilisez sudo pour exécuter un shell et utilisez un heredoc pour le gérer .

 #!/bin/bash
whoami
sudo -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami
 

(répondre à l' origine sur SuperUser )

83voto

Kimvais Points 12453

L'astuce consiste à utiliser la commande "sudo" au lieu de "su"

Vous devrez peut-être ajouter ceci

 username1 ALL=(username2) NOPASSWD: /path/to/svn
 

dans votre fichier / etc / sudoers

et changez votre script pour:

 sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update" 
 

Où nomutilisateur2 correspond à l'utilisateur pour lequel vous souhaitez exécuter la commande SVN et nomutilisateur1 à l'utilisateur exécutant le script.

Si vous avez besoin de plusieurs utilisateurs pour exécuter ce script, utilisez un %groupname au lieu du nom d'utilisateur1

53voto

Walder Points 121

Utilisez un script comme celui-ci pour exécuter le reste ou une partie du script sous un autre utilisateur:

 #!/bin/sh

id

exec sudo -u transmission /bin/sh - << eof

id

eof
 

46voto

Douglas Leeder Points 29986

Vous devez exécuter toutes les commandes d'utilisateur différent en tant que leur propre script. S'il ne s'agit que d'une ou de quelques commandes, alors inline devrait fonctionner. Si le nombre de commandes est élevé, il est probablement préférable de les déplacer dans leur propre fichier.

 su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME" 
 

7voto

iamamac Points 3333

Utilisez plutôt sudo

EDIT : Comme l'a souligné Douglas, vous ne pouvez pas utiliser cd en sudo car ce n'est pas une commande externe . Vous devez exécuter les commandes dans un sous-shell pour que le cd fonctionne.

 sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"
 

 sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update
 

Vous pouvez être invité à saisir le mot de passe de cet utilisateur, mais une seule fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X