2013-07-30 7 views
24

Sto scrivendo uno script di init che dovrebbe eseguire un singolo comando come utente diverso da root. Questo è come lo sto facendo attualmente:
sudo -u username commandCome eseguire un comando come utente specifico in uno script di init?

Questo funziona generalmente come previsto su Ubuntu/Debian, ma su RHEL lo script che viene eseguito come i command si blocca.
Esiste un altro modo per eseguire il comando come un altro utente?
(Si noti che non è possibile utilizzare le funzioni init di lsb poiché non sono disponibili su RHEL/Centos 5.x.)

+2

si noti che questa domanda è qualcosa creato esclusivamente dall'amministratore (tipicamente, un demone che viene eseguito come qualche utente per la sicurezza). Un caso leggermente diverso sono gli utenti che impostano i propri comandi per eseguire all'avvio, con il loro crontab utente. Vedi http://askubuntu.com/questions/260845/run-a-command-as-user-at-boot-time-ubuntu-12-04 –

risposta

15

Sui sistemi RHEL, lo script /etc/rc.d/init.d/functions è destinato a fornire simile a ciò che si desidera. Se lo inserisci all'inizio del tuo script di init, tutte le sue funzioni diventano disponibili.

La funzione specifica fornita per aiutare con questo è daemon. Se avete intenzione di usarlo per avviare un programma daemon-like, un utilizzo semplice sarebbe:

daemon --user=username command 

Se questo è troppo mano pesante per quello che ti serve, non c'è runuser (vedi man runuser per la piena informazioni; alcune versioni possono avere bisogno -u prima del nome utente):

/sbin/runuser username -s /bin/bash -c "command(s) to run as user username" 
+4

almeno su RHEL6, 'runuser' non accetta il parametro' -u' e uno lo eseguirà proprio come questo: 'nome utente runuser -s/bin/bash - c "command" ' – Richlv

+0

Per Centos 7, anche non usare' -u' o il comando fallisce. E '/ sbin/nome utente runuser -s/bin/bash -c" comando "' funziona. – Hustlion

10

Se si dispone di start-stop-daemon

start-stop-daemon --start --quiet -u username -g usergroup --exec command ... 
+3

Non è disponibile in RHEL 5. – ddario

+2

@ddario 'start-stop- daemon' è un Debian-ismo. –

+0

Puoi usare 'daemon', come indicato da @lagweezle nella sua [risposta] (http://stackoverflow.com/a/31616592/120794). A proposito, dovrebbe essere la risposta accettata. –

12

Invece di sudo, provare

su - username command 

Nella mia esperienza, sudo non è sempre disponibile sui sistemi RHEL , ma su è, perché su fa parte del pacchetto coreutils mentre sudo è nel pacchetto sudo.

+6

Ho provato questo, ma richiede una password per l'utente del servizio, che non intendo mai impostare. 'sudo -u ' d'altra parte, no. Si noti che li eseguo con il mio account utente, non con un account root. –

+0

sudo non funziona se 'requiretty' è impostato in/etc/sudoers (il valore predefinito in cent 6, 7 e fedora 20). – spuder

+0

Lo stesso problema qui, non posso usare l'utente perché richiede una password. Quindi qual è l'approccio migliore per questo? Nessuno sembra avere una risposta corretta :( – gromit190

10

Per gli script di init di stile systemd è davvero facile. Devi solo aggiungere un utente = nella sezione [Servizio].

Ecco un init script che uso per qBittorrent-nox su CentOS 7:

[Unit] 
Description=qbittorrent torrent server 

[Service] 
User=<username> 
ExecStart=/usr/bin/qbittorrent-nox 
Restart=on-abort 

[Install] 
WantedBy=multi-user.target 
+1

systemd potrebbe essere controverso ma questo è certamente un bel convenienza, lo farò per il mio processo con il server (hashicorp) grazie: – David

+0

Non mi tengo molto a Linux dev drama :) Ho appena trovato systemd facile da gestire da quando il centos l'ha adottato. Non tornerò mai al pasticcio che l'ha preceduto :) – LOAS