Ejecute un script de shell como un usuario diferente

42

¿Cuál es una buena manera de ejecutar un script de shell como un usuario diferente? Estoy usando Debian etch, y sé qué usuario quiero suplantar.

Si lo estuviera haciendo manualmente, haría:

su postgres
./backup_db.sh /tmp/test
exit

Como quiero automatizar el proceso, necesito una forma de ejecutar backup_db.sh como postgres (heredar el entorno, etc.)

¡Gracias!

Wadih M.
fuente

Respuestas:

67

Para ejecutar su script como otro usuario como un comando, ejecute:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Recomiendo usar siempre rutas completas en scripts como este: no siempre puede garantizar que estará en el directorio correcto cuando lo desee (tal vez alguien le cambió el nombre de usuario, quién sabe). También siempre uso la ruta completa a su (/ bin / su) porque soy paranoico. Es posible que alguien pueda editar su ruta y hacer que use una versión comprometida de su.

Baumgart
fuente
¿Siempre me solicitará que escriba la contraseña? ¿Cómo puede evitarlo?
zjffdu
2
Siempre requerirá que ingrese una contraseña si está ejecutando el comando como usuario no root. Si desea evitar la contraseña, puede configurar sudo para permitir eso. SIN EMBARGO: configurar sudo para permitir que un usuario ejecute su le permite convertirse en cualquier usuario. Sugeriría crear un script para su comando, establecer los permisos de script en 700 y propiedad de root, luego configurar sudo para permitir que un usuario ejecute ese script único.
baumgart
Creo que, si bien esta respuesta podría funcionar para el OP, no es del todo correcta. Que yo sepa, el uso de ambos -(o --login) junto con en --command, -crealidad no inicia una sesión de inicio de sesión, porque -csiempre obliga a un shell sin inicio de sesión.
JeanMertz
1
Nota: para portabilidad, - postgressdebería aparecer al final del comando. Desde la página de manual:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
jonny
9

Para automatizar esto en un horario, puede ponerlo en el crontab del usuario. Sin embargo, los trabajos de Cron no obtendrán el entorno completo, pero de todos modos podría ser mejor poner todas las variables env que necesita en el script.

Para editar el crontab del usuario:

sudo crontab -u postgres -e
Kyle Brandt
fuente
¿Podría por favor explicar más?
saravanakumar
3

Esto debería ser una lectura informativa - setuid en scripts de shell

Si ejecuta su con una - usernamesecuencia de argumentos " ", creará un shell de inicio de sesión para que el usuario proporcione el mismo entorno que el usuario. Por lo general, se utiliza para ejecutar rápidamente su secuencia de comandos con su entorno doméstico desde un inicio de sesión diferente.

nik
fuente
Esto puede ser útil si necesita realizar una serie de acciones. Pero tenga en cuenta que la mayoría de las cuentas de servicio del sistema no deberían tener rutas de inicio y shells válidos.
Dan Carley
2

Prueba la página de manual de su:

su -c script_run_as_postgres.sh - postgres

Alernamente, puede usar sudo para permitirle ejecutar solo ese comando como postgres sin una contraseña. Sin embargo, requiere algo de configuración en sus / etc / sudoers.

pjz
fuente
2

El método "su -c ..." publicado por otros es bueno. Para la automatización, puede agregar el script al crontab del usuario que necesita para ejecutarlo.

Geoff Fritz
fuente
1

Si el usuario ya tiene una entrada para sudo y no conoce la contraseña del superusuario, puede intentar lo siguiente: Este reinicia los postgres inicializados en /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
smishra
fuente
-1

También puedes usar:

sudo -u postgres script_run_as_postgres.sh

Xandersoft
fuente