web-dev-qa-db-fra.com

Exécuter une partie d'un script bash en tant qu'utilisateur différent

Existe-t-il un moyen d'exécuter une partie du script en tant qu'utilisateur différent (non root)? Si cela aide, la partie à exécuter en tant qu'utilisateur différent se produit à la fin du script.

Modifier :
OS -> Ubuntu 9.04

32
Manish Mathai

Utilisez la commande Sudo dans le script.

Sous la forme:

Sudo -u username command

la commande Sudo exécute la commande en tant que nom d'utilisateur .

Si le script est exécuté en tant que root, je ne pense pas qu'il demandera un mot de passe. Sinon, cet article explique comment utiliser Sudo avec un mot de passe dans une ligne de commande? , et cet article explique comment utiliser Sudo sans mot de passe?

38
pcapademic

Cette réponse est bonne, mais le conseil en cas de défaut du serveur est légèrement dangereux - autoriserait quiconque à exécuter n'importe quoi en tant que root! Donc, je poste ici parce que je ne peux pas formater le commentaire.

Je recommanderais d'utiliser visudo pour donner les autorisations dont vous avez besoin aussi précisément que possible. Tapez visudo et ajoutez une ligne comme celle-ci:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Si vous avez besoin d'exécuter la même chose sur plusieurs hôtes, vous pouvez l'ouvrir avec:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Mais je ne voudrais ** pas * utiliser non plus:

username ALL=(ALL) NOPASSWD: ALL

ou nom d'utilisateur hostname = ALL

La page de manuel sudoer contient de nombreux détails sanglants.

6
DaveParillo

# I = aime:

#test if running bash as a different user works
Sudo -u nobody bash -c : && RUNAS="Sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./courir

1: root
2: nobody
3: root
5
AXE-Labs

Pour le sonarqube:

Sudo -u sonar /usr/bin/sonar start

sonar est le nom de l'utilisateur utilisé pour exécuter la commande /usr/bin/sonar start

4
burtsevyg

pas tout à fait sûr, mais si vous voulez que SEULE la fin de ce script s’exécute en tant qu’utilisateur différent, vous pouvez ajouter su someuser avant la fin du script.

Est-ce que je manque quelque chose?

J'espère que cela pourra aider,

Cordialement

2
dag729

De cette façon, la fin d'un script sera exécutée par un autre utilisateur (racine). Veuillez noter les appels $[LINENO+2] et exit $?. Celles-ci sont nécessaires pour que la fin du script ne s'exécute qu'une seule fois et pour conserver le code de sortie de l'appel Sudo.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a Sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec Sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
1
dparalen