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
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?
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.
# 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
Pour le 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
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
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