web-dev-qa-db-fra.com

Comment exécuter une commande 'Sudo' dans 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 l'exécuter dans un script?

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

78
user251948

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

Sudo myscript.sh

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

Sudo -u username command 

L'espace est sans importance, il ne devrait affecter rien, il y a toujours un espace entre une commande et ses arguments.

95
terdon

Vous pouvez éventuellement modifier le fichier sudoers.

Exécutez Sudo visudo.

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

username ALL=(ALL) NOPASSWD: /path/to/script
36
Klaus-Dieter Warzecha

Vous pouvez 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 brut. Pour le rendre un peu plus sécurisé, vous pouvez créer une variable et lire le mot de passe Sudo dans la variable, puis exécuter la commande en tant que:

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

De plus, si toutes les commandes que vous exécutez en tant que root ne vous gênent pas, vous pouvez simplement exécuter votre script en utilisant Sudo, comme suggéré précédemment.

Sudo ./myscript
18
Jibbers

Cette réponse est similaire à celle de terdon réponse . Comme je le suggère également, le script principal doit être exécuté avec Sudo afin que vous puissiez exécuter les commandes sans demander à l'utilisateur de mot de passe.

Toutefois, si vous souhaitez exécuter certaines commandes non en tant qu'utilisateur root ou utilisateur système spécifique, mais en tant qu'utilisateur réel qui a exécuté la commande avec Sudo, vous pouvez rechercher la variable $Sudo_USER pour déterminer l'utilisateur d'origine.

Voici un exemple de script vous expliquant comment 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 run with root would be invoked
# with: Sudo -u $real_user
# So they will be ran 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
9
Dan
#!/bin/bash
# this declares that current user is a sudoer
Sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
Sudo npm install hexo-cli -g
mkdir Untitled
Sudo apt-get install python

# then to remove the Sudo access from the current user
Sudo /bin/rm /etc/sudoers.d/$USER
Sudo -k
3
Sanyam Jain

Il existe en fait un moyen beaucoup plus simple de le faire. Pour la portabilité, ceci est mon implémentation mais n'hésitez pas à le manipuler pour répondre à vos besoins.

Entrez votre mot de passe Sudo en tant que paramètre lors du démarrage du script, capturez-le et renvoyez-le avec chaque commande qui 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 capturer une fois le script lancé, 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 est simplement en train de regarder au-dessus de votre devrait lorsque vous exécutez un test, cela pourrait 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 une réponse à une invite. Vous pouvez donc utiliser tout ce dont vous avez besoin, si vous exécutez d'autres scripts comportant des invites de progression, dans un ordre séquentiel. Assurez-vous de connaître cet ordre, sinon, de mauvaises choses peuvent arriver.

2
csworenx

Vous pouvez essayer d’ajouter l’utilisateur qui exécute le script au fichier sudoers:

#give permissions to the file
Sudo chmod 700 /etc/sudoers.d/useradm

Sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
Sudo chmod 440 /etc/sudoers.d/useradm
0
evinhas