J'ai un script Shell qui a besoin d'un compte d'utilisateur non root pour exécuter certaines commandes, puis changer l'utilisateur en root pour exécuter le reste du script. J'utilise SUSE11 . J'ai utilisé s'attendre à automatiser le mot de passe Prompt. Mais lorsque j'utilise Spawn su - Et que la commande est exécutée, l'invite revient avec la racine et le reste du script ne s'exécute pas.
Par exemple.
< non-root commands>
spawn su -
<root commands>
Mais après, l'invite retourne avec l'utilisateur en tant que root . Comment exécuter le reste du script.
L'option Sudo -S ne résout pas le problème, car elle n'exécute pas la commande Sudo -S ifconfig dont j'ai besoin pour trouver l'adresse IP de la machine.
J'ai déjà parcouru ces liens mais je n'ai pas trouvé de solution: Changer le répertoire du script en répertoire utilisateur dans un script Shell
Sudo
fonctionnera ici, mais vous devez changer un peu votre script:
$ cat 1.sh
id
Sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF
$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(Fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!
Vous devez exécuter votre commande dans le bloc <<EOF
et attribuer le bloc à Sudo
.
Si vous le souhaitez, vous pouvez utiliser su
, bien sûr. Mais vous devez l'exécuter en utilisant expect/pexpect
qui entrera un mot de passe pour vous.
Mais même si vous pouviez saisir le mot de passe automatiquement (ou l’éteindre), cette construction ne fonctionnerait pas:
user-command
su
root-command
Dans ce cas, root-command
sera exécuté avec l'utilisateur, pas avec les privilèges root, car il sera exécuté une fois que su
sera terminé (su
ouvre un nouveau shell et ne modifie pas l'identifiant du shell actuel). Vous pouvez utiliser le même truc ici bien sûr:
su -c 'sh -s' <<EOF
# list of root commands
EOF
Mais maintenant, vous avez la même chose qu'avec Sudo
.
Il existe un moyen simple de le faire sans un second script. Il suffit de mettre ceci au début de votre fichier:
if [ "$(whoami)" != "root" ]
then
Sudo su -s "$0"
exit
fi
Ensuite, il s’exécutera automatiquement en tant que root. Bien sûr, cela suppose que vous pouvez Sudo su
sans avoir à fournir de mot de passe - mais cela sort du cadre de cette réponse; Consultez l’une des autres questions sur l’utilisation de scripts Sudo dans Sudo dans Shell pour savoir comment le faire.
Le moyen le plus simple consiste à créer au moins deux scripts.
Le premier devrait appeler le second avec les privilèges root. Ainsi, chaque commande que vous exécuterez dans le second script sera exécutée en tant que root.
Par exemple:
runasroot.sh
Sudo su-c'./scriptname.sh'
nom_script.sh
apt-get install mysql-server-5.5
ou ce dont vous avez besoin.
Version courte: créez un bloc pour inclure toutes les commandes à exécuter en tant que root.
Par exemple, j'ai créé un script pour exécuter une commande à partir d'un sous-répertoire racine, le segment se présente comme suit:
Sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF