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

33

Existe-t-il un moyen d'exécuter une partie d'un 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

Manish Mathai
la source
1
doublon possible de l'ID utilisateur de changement / modification
Dan Dascalescu

Réponses:

42

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 de l' utilisateur .

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

pcapademic
la source
5
C'est agréable et facile, mais existe-t-il un moyen de le faire pour un groupe de commandes au lieu d'une à la fois?
Andrew
écrire un script bash, le rendre exécutable chmod +x script.sh, puis justesudo -u username script.sh
NiCU
@Andrew Je me le demandais moi-même et les choses suivantes ont fonctionné pour moi: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell
Incluez également l' ioption si vous souhaitez acquérir l'environnement de l'utilisateur
neoDev
6

Cette réponse est bonne, mais les conseils de défaut de serveur sont légèrement dangereux - permettraient à n'importe qui d'exécuter n'importe quoi en tant que root! Je poste donc 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 visudoet ajoutez une ligne comme:

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

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

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

Mais je n'utiliserais pas ** non plus:

username ALL=(ALL) NOPASSWD: ALL

ou nom d'utilisateur hostname = ALL

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

DaveParillo
la source
Cela fonctionnerait-il pour une commande disponible uniquement pour un utilisateur particulier?
Manish Mathai
Vous pouvez spécifier que seuls des utilisateurs particuliers peuvent exécuter la commande (dans les exemples ci-dessus, remplacez usernamepar le nom d'utilisateur qui devrait pouvoir exécuter la commande). Si l'exécutable que vous souhaitez exécuter n'est exécutable que par un utilisateur particulier, c'est bien aussi - passez simplement ce nom d'utilisateur dans la sudo -u username commandlineligne du script.
James Polley
@Manish. Oui. Ce que dit le fichier sudoers est "Autoriser ce nom d'utilisateur sur cet hôte à exécuter command1 sans avoir à fournir de mot de passe.
DaveParillo
6

# J'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
AX Labs
la source
10
Pourriez-vous ajouter un texte explicatif?
Kazark
4

Pour sonarqube:

sudo -u sonar /usr/bin/sonar start

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

burtsevyg
la source
2

pas si sûr, mais si vous voulez que SEULEMENT la fin de ce script s'exécute en tant qu'utilisateur différent, vous pouvez ajouter su someuseravant la fin du script.

Suis-je en train de manquer quelque chose?

J'espère que ça t'as aidé,

Cordialement

dag729
la source
1
Je pense que c'est la réponse la plus appropriée, ayant toutes les autres réponses suggérant sudo, qui n'est souvent pas installé par défaut sur certaines installations Linux minimales.
Tim
1

De cette façon, la fin d'un script sera exécutée par différents utilisateurs (root). Veuillez noter les appels $[LINENO+2]et exit $?. Ceux-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' sudoappel.

#!/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
dparalen
la source