2010-08-06 8 views
21

¿Puedo cambiar/su usuario en el medio de un script?¿Puedo ejecutar 'su' en el medio de un 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

posible duplicado de [¿Cómo se utiliza su para ejecutar el resto de la escritura del golpe como ese usuario?] (Http://stackoverflow.com/questions/1988249/how-do- i-use-su-to-execute-the-rest-of-the-bash-script-as-that-user) –

Respuesta

37

Puede, pero bash no ejecutará los comandos posteriores como postgres. En su lugar, hacer:

su postgres -c 'dropdb $user' 

La bandera -c ejecuta un comando como el usuario (ver man su).

+0

gracias @Mark Trapp – Radek

+6

Te gustaría utilizar comillas dobles allí: 'su postgres -c "dropdb $ user" ' –

+1

Puede poner varias líneas si la cita de cierre viene en otra línea. Tenga cuidado de citar en ese caso. –

4

No, no puedes. O al menos ... puede su pero su simplemente abrirá un nuevo intérprete de comandos en ese punto y cuando lo haga continuará con el resto del guión.

Una manera de evitarlo es usar su -c 'some command'

9

No de esta manera. su invocará un proceso, que se predetermina a un shell. En la línea de comando, este shell será interactivo, por lo que puede ingresar comandos. En el contexto de un script, el shell finalizará de inmediato (porque no tiene nada que ver).

Con

su user -c command 

command se ejecutará como user - si el su tiene éxito, que es por lo general sólo en el caso de usuarios sin contraseña o cuando se ejecuta la secuencia de comandos como root.

Utilice sudo para tener un enfoque mejor y más refinado.

2

Otra idea interesante que escuché hoy es hacer una llamada recursiva en el script, cuando se ejecuta como root y desea ejecutar el script como otro usuario. Véase el siguiente ejemplo:

Me postulo guión "my_script" como "root" y desea que el script se ejecute como usuario "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

Si no tiene nada que hacer después de que "raamee" funcione, puede: 'exec sudo -u raamee my_script' - que reemplaza el proceso actual en lugar de mantenerlo. –

+0

Inteligente, pero un documento aquí es más simple (ver mi respuesta). –

+0

Una cosa a tener en cuenta con esto es que el usuario sudo'd (si no es el usuario root) necesita tener permisos para ejecutar el script. –

13

Puede utilizar un here document para incrustar múltiples su comandos en la secuencia de comandos:

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

Tenga cuidado, creo que algunos personajes, como el retroceso, deben ser escapados si los pone en un documento aquí. –

1

Consulte respuestas en cuestión a continuación,

Puede escribir entre < < EOF y EOF como se menciona en las respuestas.

#!/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

Agregue -i a sudo para obtener el entorno de algún usuario. –

Cuestiones relacionadas