tutorial script comandos bourne again bash shell

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.



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 ).