Soluzione 1:
Per eseguire il tuo script come un altro utente come un unico comando, esegui:
/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
Raccomando di utilizzare sempre percorsi completi in script come questo:non puoi sempre garantire che sarai nella directory giusta quando su (forse qualcuno ha cambiato la homedir su di te, chissà). Uso sempre anche il percorso completo per su (/bin/su) perché sono paranoico. È possibile che qualcuno possa modificare il tuo percorso e farti utilizzare una versione compromessa di su.
Soluzione 2:
Se l'utente di destinazione da eseguire ha nologin shelll definito, allora puoi usare l'opzione -s per specificare la shell:
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
Vedi la seguente domanda:esegui lo script come utente che non ha shell di accesso
Soluzione 3:
Per automatizzarlo in base a una pianificazione, puoi inserirlo nel crontab dell'utente. Tuttavia, i lavori Cron non otterranno l'ambiente completo, ma potrebbe essere meglio inserire comunque tutte le variabili env necessarie nello script stesso.
Per modificare il crontab dell'utente:
sudo crontab -u postgres -e
Soluzione 4:
Questa dovrebbe essere una lettura informativa -- setuid sugli script di shell
Se esegui su con "- username
"sequenza di argomenti, creerà una shell di login per consentire all'utente di fornire lo stesso ambiente dell'utente. Solitamente, utilizzato per eseguire rapidamente lo script con il proprio ambiente home da un login diverso.
Soluzione 5:
Prova la su manpage:
su -c script_run_as_postgres.sh - postgres
In alternativa, puoi usare sudo per permetterti di eseguire solo quel comando come postgres senza password. Ci vuole un po' di configurazione nel tuo /etc/sudoers, però.