133 votes

Comment exécuter une commande 'sudo' à l'intérieur d'un script ?

Pour faire un patch manuellement je dois taper cette commande

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

Il y a un espace juste avant le 09 :

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

Comment puis-je exécuter ceci à l'intérieur d'un script ?

Il existe également plusieurs autres commandes, mais celle-ci pose problème.

158voto

Stewart Points 1385

C'est rarement une bonne idée d'avoir sudo à l'intérieur de scripts. Au lieu de cela, supprimez le sudo à partir du script et exécuter le script lui-même avec sudo :

sudo myscript.sh

De cette façon, toutes les commandes dans le script seront exécutées avec les privilèges de root et vous ne devrez donner le mot de passe qu'une seule fois lors du lancement du script. Si vous avez besoin qu'une commande particulière dans le script soit exécutée sans les privilèges de l'utilisateur root. sudo vous pouvez l'exécuter en tant qu'utilisateur ordinaire avec (merci Lie Ryan ) :

sudo -u username command 

L'espace n'est pas pertinent, il ne devrait pas affecter quoi que ce soit. toujours un espace entre une commande et ses arguments.

55voto

Vous pouvez éventuellement modifier le sudoers fichier.

Exécuter sudo visudo .

Ajoutez une entrée pour votre nom d'utilisateur et le script que vous souhaitez exécuter sans qu'on vous demande un mot de passe.

username ALL=(ALL) NOPASSWD: /path/to/script

33voto

Jibbers Points 544

Vous pourriez essayer quelque chose comme :

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Ce n'est pas la chose la plus sûre à faire puisque vous écrivez un mot de passe sudoer en texte clair. Pour le rendre un peu plus sûr, vous pouvez créer une variable et lire le mot de passe sudo dans la variable, puis vous pouvez exécuter la commande comme suit :

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

De plus, si cela ne vous dérange pas que toutes vos commandes soient exécutées en tant que root, vous pouvez simplement exécuter votre script en utilisant sudo comme suggéré précédemment.

sudo ./myscript

23voto

Ingvald Points 373

Cette réponse est similaire à celle de Terdon réponse . Je suggère également d'exécuter le script principal avec sudo afin que le script puisse s'exécuter sans avoir à demander le mot de passe de l'utilisateur lors de son exécution.

Toutefois, si vous souhaitez supprimer les privilèges de l'utilisateur root pour certaines commandes et les exécuter en tant qu'utilisateur réel qui a invoqué la commande à l'aide de la commande sudo vous pouvez vérifier si le $SUDO_USER pour connaître l'utilisateur d'origine.

Voici un exemple script de la façon dont vous pourriez y parvenir :

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command

7voto

csworenx Points 124

Il existe en fait un moyen beaucoup plus simple de le faire. Pour des raisons de portabilité, voici mon implémentation, mais n'hésitez pas à la manipuler selon vos besoins.

Entrez votre mot de passe sudo en tant que paramètre lors du démarrage du script, capturez-le et faites-en l'écho avec chaque commande qui vous demandera le mot de passe sudo.

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

Vous pouvez ajouter une invite et une capture après le lancement du script comme suit :

echo "enter the sudo password, please"
read PW

Mais si quelqu'un d'autre surveille ce qui est exécuté sur le nœud, a accès aux journaux créés par celui-ci ou regarde par-dessus votre épaule au hasard lorsque vous exécutez un test, cela peut compromettre la sécurité.

Cela fonctionne également avec les commandes/scripts en cours d'exécution qui nécessitent un oui pour continuer :

echo $PW | yes | ./install.sh

L'écho est en réponse à une invite, donc vous pouvez utiliser tout ce dont vous avez besoin, là, si vous exécutez d'autres scripts qui ont des invites de progression, dans un ordre séquentiel. Assurez-vous de connaître cet ordre, cependant, ou de mauvaises choses peuvent se produire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X