Come si esegue un comando 'sudo' all'interno di uno script?

59

Per eseguire manualmente una patch, devo digitare questo comando

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

C'è uno spazio poco prima del 09:

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

Come posso eseguirlo all'interno di uno script?

Ci sono anche molti altri comandi, ma questo causa problemi.

    
posta user251948 24.02.2014 - 23:27

7 risposte

80

Raramente è una buona idea avere sudo negli script. Invece, rimuovi sudo dallo script ed esegui lo script stesso con sudo :

sudo myscript.sh

In questo modo, tutti i comandi all'interno dello script verranno eseguiti con i privilegi di root e sarà sufficiente fornire la password una sola volta all'avvio dello script. Se è necessario eseguire un comando particolare all'interno dello script senza privilegi sudo , è possibile eseguirlo come utente normale con (grazie Lie Ryan ):

sudo -u username command 

Lo spazio è irrilevante, non dovrebbe influenzare nulla, c'è sempre uno spazio tra un comando e i suoi argomenti.

    
risposta data terdon 25.02.2014 - 12:17
30

È possibile modificare il file sudoers .

Esegui sudo visudo .

Aggiungi una voce per il tuo nome utente e lo script che desideri eseguire senza richiedere una password.

username ALL=(ALL) NOPASSWD: /path/to/script
    
risposta data Klaus-Dieter Warzecha 24.02.2014 - 23:46
16

Potresti provare qualcosa del tipo:

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

Questa non è la cosa più sicura da fare dato che stai scrivendo una password sudoer in testo semplice. Per renderlo un po 'più sicuro è possibile creare una variabile e leggere la password sudo nella variabile e quindi eseguire il comando come:

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

Inoltre, se non ti dispiace che tutti i tuoi comandi vengano eseguiti come root, puoi eseguire semplicemente lo script usando sudo , come suggerito in precedenza.

sudo ./myscript
    
risposta data Jibbers 06.02.2015 - 15:48
7

Questa risposta è simile alla risposta di terdon. Come suggerirei anche di eseguire lo script principale con sudo in modo da poter eseguire i comandi senza chiedere all'utente alcuna password.

Tuttavia, nel caso in cui si desideri eseguire alcuni dei comandi non come utente root o utente di sistema specifico, ma come utente effettivo che ha eseguito il comando con sudo , è possibile verificare la variabile $SUDO_USER in capire l'utente originale.

Questo è uno script di esempio su come puoi ottenere ciò:

#!/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
    
risposta data Dan 30.10.2017 - 14:21
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
    
risposta data Sanyam Jain 06.12.2015 - 08:44
2

In realtà c'è un modo molto più semplice per farlo. Per la portabilità, questa è la mia implementazione, ma sentiti libero di manipolarla in base alle tue esigenze.

Inserisci la tua password sudo come parametro all'avvio dello script, acquisiscilo e richiamalo con ogni comando che richiederà la password 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>

Puoi aggiungere un prompt e catturare dopo che lo script è stato avviato in questo modo:

echo "enter the sudo password, please"
read PW

Ma se qualcun altro controlla ciò che viene eseguito sul nodo; ha accesso ai log creati da esso; o stai semplicemente controllando casualmente quando esegui un test, che potrebbe compromettere la sicurezza.

Questo funziona anche con comandi / script in esecuzione che richiedono un sì per continuare:

echo $PW | yes | ./install.sh

L'eco è in risposta a un prompt, quindi puoi utilizzare qualsiasi cosa tu debba, lì, se stai eseguendo altri script che richiedono istruzioni per il progresso, in ordine sequenziale. Assicurati di sapere che l'ordine, però, o le cose brutte possono accadere.

    
risposta data csworenx 22.06.2018 - 00:11
0

Potresti provare ad aggiungere l'utente che esegue lo script al file 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
    
risposta data evinhas 19.01.2017 - 16:10

Leggi altre domande sui tag