Esegui uno script di shell come un altro utente


42

Qual è un buon modo per eseguire uno script di 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!

Risposte:


67

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


Mi richiederà sempre di digitare la password? Come aggirarlo?
zjffdu,

2
Sarà sempre necessario digitare una password se si esegue il comando come utente non root. Se si desidera evitare la password, è possibile configurare sudo per consentirlo. TUTTAVIA - la configurazione di sudo per consentire a un utente di eseguire su consente loro di diventare qualsiasi utente. Suggerirei di creare uno script per il tuo comando, impostando le autorizzazioni dello script su 700 e di proprietà di root, quindi configurando sudo per consentire a un utente di eseguire quel singolo script.
baumgart,

Credo che, sebbene questa risposta possa funzionare per l'OP, non è del tutto corretta. Per quanto ne sappia, l'utilizzo di entrambi -(o --login) insieme a --command, -cnon avvia effettivamente una sessione di accesso, poiché -cforza sempre una shell non di accesso.
JeanMertz,

1
Nota: per portabilità, - postgressdovrebbe apparire alla fine del comando. Dalla pagina man: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

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

Potresti spiegare di più?
saravanakumar,

3

Questo dovrebbe essere un set informativo informativo su script di shell

Se si esegue su con una " - username" sequenza di argomenti, verrà creata una shell di accesso per l'utente per fornire lo stesso ambiente dell'utente. Di solito, viene utilizzato per eseguire rapidamente lo script con l'ambiente di casa da un accesso diverso.


Questo può essere utile, se è necessario eseguire una serie di azioni. Tuttavia, tenere presente che la maggior parte degli account dei servizi di sistema non dovrebbe disporre di percorsi e shell home validi.
Dan Carley,

2

Prova la manpage di su:

su -c script_run_as_postgres.sh - postgres

In alternativa, potresti 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

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.


1

Se l'utente ha già una voce su sudo e non si conosce la password del superutente, è possibile provare a seguire: Questo riavvia i postgres inizializzati in /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

Puoi anche usare:

sudo -u postgres script_run_as_postgres.sh

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.