2012-07-24 25 views
12

Ho uno script di shell che richiede un account utente non root per eseguire determinati comandi e quindi modificare l'utente in root per eseguire il resto dello script. Sto usando SUSE11. Ho usato prevede di automatizzare la richiesta della password. Ma quando uso lo spawn su - e il comando viene eseguito, il prompt ritorna con root e il resto dello script non viene eseguito.Modifica per utente root nello script di shell

Es.

< non-root commands> 
spawn su - 
<root commands> 

Ma dopo su - il prompt ritorna con utente come utente root. Come eseguire il resto dello script.

L'opzione sudo -S non è di aiuto in quanto non esegue il comando sudo -S ifconfig che devo trovare l'indirizzo IP della macchina.

ho già passato attraverso questi collegamenti, ma non sono riuscito a trovare una soluzione: Change script directory to user's homedir in a shell script

Changing unix user in a shell script

Grazie in anticipo

risposta

15

sudo funzionerà qui, ma è necessario cambiare voi lo script un po ' :

$ 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! 

È necessario eseguire il tuo c ommando nel blocco <<EOF e dare il blocco a sudo.

Se lo si desidera, è possibile utilizzare su, naturalmente. Ma devi eseguirlo usando expect/pexpect che inserirà la password per te.

Ma anche caso si potrebbe riuscire a inserire la password automaticamente (o spegnerlo) questa costruzione non avrebbe funzionato:

user-command 
su 
root-command 

In questo caso root-command verrà eseguito con l'utente, non con i privilegi di root, perché sarà eseguito dopo che su sarà terminato (su apre una nuova shell, non cambia uid della shell corrente). È possibile usare lo stesso trucco, naturalmente:

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

Ma ora avete lo stesso con sudo.

1

Il modo più semplice per farlo sarebbe quello di creare almeno due script.

Il primo deve chiamare il secondo con privilegi di root. Quindi ogni comando che eseguirai nel secondo script verrebbe eseguito come root.

Ad esempio:

runasroot.sh

sudo su-c'./scriptname.sh' 

nomescript.sh

apt-get install mysql-server-5.5 

o qualsiasi altra cosa tu abbia bisogno.

+0

E se invece di root, si chiami $ USERNAME2? Grazie in anticipo. – raja777m

8

C'è un modo semplice per farlo senza un secondo copione. Metti questo all'inizio del tuo file:

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

Quindi verrà eseguito automaticamente come root. Ovviamente, si presume che sia possibile effettuare il sudo su senza dover fornire una password, ma ciò non rientra nell'ambito di questa risposta; vedi una delle altre domande sull'uso di sudo negli script di shell per come farlo.

+0

Attenzione; '" $ 0 "' [potrebbe non essere quello che pensi che sia] (http://mywiki.wooledge.org/BashFAQ/028). – ELLIOTTCABLE

+1

@ELLIOTTCABLE Questo è interessante, ma sto facendo qui l'ipotesi che $ 0 sia il comando per avviare il processo corrente, non il percorso del file corrente, quindi è un po 'meno fragile. Ancora, un buon punto e collegamento molto utile. – Benubird

+0

per la richiesta di password, basta usare 'echo $ PASSWORD | sudo -S su -c "$ 0" ' – Leathan

Problemi correlati