Comment exécuter une commande 'sudo' dans un script?

59

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 cela dans un script?

Il y a aussi plusieurs autres commandes mais celle-ci pose problème.

    
posée user251948 24.02.2014 - 23:27
la source

7 réponses

80

Il est rarement recommandé d’avoir sudo dans les 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 façon, toutes les commandes du script seront exécutées avec les privilèges root et il vous suffit de donner le mot de passe une seule fois lors du lancement du script. Si vous avez besoin d'une commande particulière dans le script pour s'exécuter sans les privilèges sudo , vous pouvez l'exécuter en tant qu'utilisateur régulier avec (merci Lie Ryan ):

sudo -u username command 

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

    
réponse donnée terdon 25.02.2014 - 12:17
la source
30

Vous pouvez éventuellement modifier le fichier sudoers .

Exécuter sudo visudo .

Ajoutez une entrée pour votre nom d'utilisateur et le script que vous souhaitez exécuter sans être invité à saisir un mot de passe.

username ALL=(ALL) NOPASSWD: /path/to/script
    
réponse donnée Klaus-Dieter Warzecha 24.02.2014 - 23:46
la source
16

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 brut. 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 exécuter la commande en tant que:

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

En outre, si vous ne vous opposez pas à l’exécution de toutes vos commandes en tant que root, vous pouvez simplement exécuter votre script en utilisant sudo , comme suggéré précédemment.

sudo ./myscript
    
réponse donnée Jibbers 06.02.2015 - 15:48
la source
6

Cette réponse est similaire à la réponse de terdon. Comme je le suggérerais également, exécutez le script principal avec sudo afin de pouvoir exécuter les commandes sans demander à l'utilisateur aucun mot de passe.

Toutefois, si vous souhaitez exécuter certaines des commandes non pas en tant qu’utilisateur root ou utilisateur du système, mais en tant qu’utilisateur réel ayant exécuté la commande avec sudo , vous pouvez vérifier la variable $SUDO_USER trouver l'utilisateur d'origine.

Ceci est un exemple de script sur la façon dont vous pourriez réaliser cela:

#!/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
    
réponse donnée Dan 30.10.2017 - 14:21
la source
3
#!/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
    
réponse donnée Sanyam Jain 06.12.2015 - 08:44
la source
1

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

Entrez votre mot de passe sudo comme 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=
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 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 est juste en train de regarder au hasard votre devrait quand 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 en réponse à une invite, vous pouvez donc utiliser tout ce dont vous avez besoin, si vous exécutez d'autres scripts qui ont des demandes de progression, dans un ordre séquentiel. Assurez-vous que vous connaissez cet ordre, mais de mauvaises choses peuvent arriver.

    
réponse donnée csworenx 22.06.2018 - 00:11
la source
0

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
    
réponse donnée evinhas 19.01.2017 - 16:10
la source

Lire d'autres questions sur les étiquettes