web-dev-qa-db-fra.com

Passage en utilisateur root dans le script shell

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

Changer d'utilisateur Unix dans un script Shell

14
Deepti Jain

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.

18
Igor Chubin

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.

9
Benubird

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.

1
Josh

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
0
Juan T