2010-08-06 18 views
21

posso modificare/su utente nel mezzo di uno script?posso eseguire 'su' nel mezzo di uno script bash?

if [ "$user" == "" ]; then 
    echo "Enter the table name"; 
    read user 
fi 

gunzip * 
chown postgres * 
su postgres 
dropdb $user 
psql -c "create database $user with encoding 'unicode';" -U dbname template1 
psql -d $user -f *.sql 
+0

possibile duplicato di [Come si usa su per eseguire il resto dello script bash come quell'utente?] (Http://stackoverflow.com/questions/1988249/how-do- i-use-su-to-execute-the-rest-of-the-bash-script-as-that-user) –

risposta

37

È possibile, ma bash non eseguirà i comandi successivi come postgres. Invece, fare:

su postgres -c 'dropdb $user' 

La bandiera -c esegue un comando come utente (vedi man su).

+0

grazie @ Mark Trapp – Radek

+6

Si vorrebbe usare le virgolette doppie qui: 'su postgres -c "dropdb $ user" ' –

+1

Puoi mettere più righe se la citazione di chiusura arriva su un'altra linea. Abbi cura di quotare in quel caso. –

4

No, non è possibile. O almeno ... si può su, ma su semplicemente aprirà una nuova shell in quel punto e quando avrà finito continuerà con il resto della sceneggiatura.

Un modo per aggirare è quello di utilizzare su -c 'some command'

9

Non così. su invocherà un processo, che per impostazione predefinita è una shell. Sulla riga di comando, questa shell sarà interattiva, quindi è possibile immettere comandi. Nel contesto di uno script, la shell finirà immediatamente (perché non ha nulla da fare).

Con

su user -c command 

command verrà eseguito come user - se il su riesce, che è generalmente solo il caso con gli utenti senza password o quando si esegue lo script come root.

Utilizzare sudo per un approccio migliore e più a grana fine.

2

Un'altra idea interessante che ho sentito oggi è quella di eseguire una chiamata ricorsiva sullo script, quando si esegue come root e si desidera eseguire lo script come un altro utente. Vedere l'esempio di seguito:

Sono in esecuzione script "mio_script" come "root" e vogliono lo script per l'esecuzione come utente "raamee"


#!/bin/bash 

#Script name is: my_script 

user=`whoami` 

if [ "$user" == "root" ]; then 
    # As suggested by glenn jackman. Since I don't have anything to run once 
    # switching the user, I can modify the next line to: 
    # exec sudo -u raamee my_script and reuse the same process 
    sudo -u raamee my_script 
fi 

if [ "$user" == "raamee" ]; then 
    #put here the commands you want to perform 
    do_command_1 
    do_command_2 
    do_command_3 
fi 
+1

Se non hai niente da fare dopo che "raamee" funziona, allora puoi: "exec sudo -u raamee my_script' - che sostituisce il processo corrente invece di tenerlo in giro. –

+0

Intelligente, ma un documento qui è più semplice (vedi la mia risposta). –

+0

Una cosa da tenere a mente con questo è l'utente sudo'd (se non root) deve avere le autorizzazioni per eseguire lo script stesso. –

13

È possibile utilizzare un here document per incorporare molteplici su i comandi nello script:

if [ "$user" == "" ]; then 
    echo "Enter the table name"; 
    read user 
fi 

gunzip * 
chown postgres * 
su postgres <<EOSU 
dropdb $user 
psql -c "create database $user with encoding 'unicode';" -U dbname template1 
psql -d $user -f *.sql 
EOSU 
+0

Fai attenzione, penso che alcuni caratteri, come il backtick, debbano essere sfuggiti se li inserisci in un documento qui. –

1

Fare riferimento alle risposte a domanda qui sotto,

È possibile scrivere tra < < EOF ed EOF come indicato nelle risposte.

#!/bin/bash 
whoami 
sudo -u someuser bash << EOF 
echo "In" 
whoami 
EOF 
echo "Out" 
whoami 

How do I use su to execute the rest of the bash script as that user?

+0

Aggiungi -i a sudo per ottenere l'ambiente di un utente. –

Problemi correlati