Solución 1:
Para ejecutar su secuencia de comandos 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 siempre usar rutas completas en scripts como este:no siempre puede garantizar que estará en el directorio correcto cuando su (quizás alguien le cambió el homedir, quién sabe). También uso siempre 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.
Solución 2:
Si el usuario de destino que se va a ejecutar no tiene definido el shell de inicio de sesión, entonces puede usar la opción -s para especificar el shell:
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
Consulte la siguiente pregunta:ejecute el script como usuario que no tiene shell de inicio de sesión
Solución 3:
Para automatizar esto en un horario, puede ponerlo en el crontab del usuario. Sin embargo, los trabajos 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
Solución 4:
Esta debería ser una lectura informativa:setuid en scripts de shell
Si ejecuta su con un "- username
" secuencia 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.
Solución 5:
Pruebe la página de manual de su:
su -c script_run_as_postgres.sh - postgres
Alternativamente, podría usar sudo para permitirle ejecutar solo ese comando como postgres sin una contraseña. Sin embargo, requiere cierta configuración en su /etc/sudoers.