sviluppo-web-qa.it

Esegui uno script Shell come un altro utente

Qual è un buon modo per eseguire uno script Shell come un altro utente. Sto usando Debian etch e so quale utente voglio impersonare.

Se lo facessi manualmente, farei:

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

Dal momento che voglio automatizzare il processo, ho bisogno di un modo per eseguire backup_db.sh come postgres (ereditando l'ambiente, ecc.)

Grazie!

44
Wadih M.

Per eseguire lo script come un altro utente come un comando, eseguire:

/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

Ti consiglio di utilizzare sempre percorsi completi in script come questo: non puoi sempre garantire che sarai nella directory giusta quando esegui il su (forse qualcuno ha cambiato l'omedir su di te, chi lo sa). Uso sempre anche il percorso completo di su (/ bin/su) perché sono paranoico. È possibile che qualcuno possa modificare il tuo percorso e farti usare una versione compromessa di su.

69
baumgart

Se per l'utente di destinazione da eseguire è stata definita la shelll di nologin, è possibile utilizzare l'opzione -s per specificare Shell:

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

Vedi la seguente domanda: esegui lo script come utente con nologin Shell

23
Basil A

Per automatizzare questo su una pianificazione, è possibile inserirlo nel crontab dell'utente. I lavori Cron, tuttavia, non otterranno l'intero ambiente, ma potrebbe essere meglio inserire tutte le variabili env necessarie nello script stesso.

Per modificare il crontab dell'utente:

Sudo crontab -u postgres -e
9
Kyle Brandt

Questa dovrebbe essere una lettura informativa - setuid su script Shell

Se esegui su con un "- username "sequenza di argomenti, creerà una Shell di accesso affinché l'utente fornisca lo stesso ambiente dell'utente. Solitamente, viene utilizzato per eseguire rapidamente lo script con l'ambiente di casa da un altro accesso.

3
nik

Prova la manpage di su:

su -c script_run_as_postgres.sh - postgres

In alternativa, puoi usare Sudo per permetterti di eseguire solo quel comman come postgres senza password. Però ci vuole un po 'di setup nel tuo/etc/sudoers.

2
pjz

Il metodo "su -c ..." pubblicato da altri è valido. Per l'automazione, potresti aggiungere lo script al crontab dell'utente di cui hai bisogno per eseguirlo.

2
Geoff Fritz

Se l'utente ha già una voce in Sudo e non conosci la password del superutente, puoi provare a seguire: Questo riavvia i postgres inizializzati su /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"
1
smishra

Puoi anche usare:

Sudo -u postgres script_run_as_postgres.sh

0
Xandersoft