bash - script - bourne again shell
¿Puedo ejecutar ''su'' en medio de un script de bash? (6)
¿Puedo cambiar / su usuario en medio de un script?
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
Así no. su
invocará un proceso, que por defecto es un shell. En la línea de comandos, este shell será interactivo, por lo que puede ingresar comandos. En el contexto de un script, el shell terminará de inmediato (porque no tiene nada que hacer).
Con
su user -c command
command
se ejecutará como user
; si el su
tiene éxito, lo que generalmente ocurre solo con los usuarios sin contraseña o cuando se ejecuta el script como root.
Utilice sudo
para un enfoque mejor y más fino.
Consulte las respuestas en la siguiente pregunta,
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
¿Cómo uso su para ejecutar el resto del script bash como ese usuario?
No tu no puedes O al menos ... puedes usar su pero simplemente abrirá un nuevo shell en ese momento y cuando termine, continuará con el resto del script.
Una forma de evitarlo es usar su -c ''some command''
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. Vea el ejemplo a continuación:
Estoy ejecutando el script "my_script" como "root" y quiero 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
Puede usar un documento aquí para incrustar múltiples comandos su
en su 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
Puede, pero bash no ejecutará los comandos subsiguientes como postgres. En su lugar, hacer:
su postgres -c ''dropdb $user''
El indicador -c
ejecuta un comando como usuario (ver man su
).