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
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:
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
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.
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
Réponses:
Utilisez la commande sudo dans le script.
Sous la forme:
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?
la source
chmod +x script.sh
, puis justesudo -u username script.sh
i
option si vous souhaitez acquérir l'environnement de l'utilisateurCette 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
visudo
et ajoutez une ligne comme:Si vous avez besoin d'exécuter cette même chose sur de nombreux hôtes, vous pouvez l'ouvrir avec:
Mais je n'utiliserais pas ** non plus:
ou nom d'utilisateur hostname = ALL
La page de manuel sudoer contient de nombreux détails sanglants
la source
username
par 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 lasudo -u username commandline
ligne du script.# J'aime:
# ./courir
la source
Pour sonarqube:
sudo -u sonar /usr/bin/sonar start
où
sonar
est le nom de l'utilisateur utilisé pour exécuter la commande/usr/bin/sonar start
la source
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 someuser
avant la fin du script.Suis-je en train de manquer quelque chose?
J'espère que ça t'as aidé,
Cordialement
la source
De cette façon, la fin d'un script sera exécutée par différents utilisateurs (root). Veuillez noter les appels
$[LINENO+2]
etexit $?
. 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'sudo
appel.la source