2013-07-30 8 views
24

Ich schreibe ein Init-Skript, das einen einzelnen Befehl als Benutzer anders als root ausführen soll. Dies ist, wie ich es mache zur Zeit:
sudo -u username commandWie führe ich einen Befehl als spezifischen Benutzer in einem Init-Skript aus?

Diese im Allgemeinen als auf Ubuntu/Debian, aber auf RHEL das Skript erwartet funktioniert, die als die command hängt ausgeführt wird.
Gibt es eine andere Möglichkeit, den Befehl als ein anderer Benutzer auszuführen?
(Beachten Sie, dass ich nicht lsb init-Funktionen verwenden können, wie sie auf RHEL/CentOS 5.x nicht verfügbar sind)

+2

Beachten Sie, dass diese Frage über etwas ist ausschließlich durch den Administrator (in der Regel ein Dämon, der für die Sicherheit läuft wie einige Benutzer einrichten). Ein etwas anderer Fall sind Benutzer, die ihre eigenen Befehle zum Booten mit ihrem Benutzer crontab ausführen. Siehe http://askubuntu.com/questions/260845/run-a-command-as-user-at-boot-time-ubuntu-12-04 –

Antwort

15

Auf RHEL-Systemen, die /etc/rc.d/init.d/functions Skript soll ähnlich dem, was Sie wollen. Wenn Sie das oben im Init-Skript eingeben, werden alle Funktionen verfügbar.

Die spezifische Funktion, die zur Verfügung gestellt wird, ist daemon. Wenn Sie beabsichtigen, es zu verwenden, um ein Dämon-ähnliches Programm zu starten, wird eine einfache Bedienung wäre:

daemon --user=username command 

Wenn das zu plump ist für das, was Sie brauchen, gibt es runuser (siehe man runuser für vollständige Informationen; einige Versionen müssen möglicherweise den Benutzernamen -u vor):

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

zumindest auf RHEL6, 'runuser' akzeptiert den' -u' Parameter nicht und man würde es einfach so ausführen: 'runuser username -s/bin/bash - c "command" ' – Richlv

+0

Für Centos 7 sollte auch nicht '-u' verwendet werden oder der Befehl schlägt fehl. Und '/ sbin/runuser Benutzername -s/bin/bash -c" Befehl "' funktioniert. – Hustlion

10

Wenn Sie start-stop-daemon haben

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

Es ist nicht in RHEL 5 verfügbar. – ddario

+2

@ddaroi 'start-stop- daemon' ist ein Debian-ism. –

+0

Sie können 'daemon' verwenden, wie @lagweezle in seiner Antwort [http://stackoverflow.com/a/31616592/120794] darauf hinweist. Übrigens sollte es die akzeptierte Antwort sein. –

12

Statt sudo, versuchen

su - username command 

Nach meiner Erfahrung sudo auf RHEL-Systemen nicht immer verfügbar ist aber su ist, weil su Teil des coreutils-Pakets ist, während sudo ist im Sudo-Paket.

+6

Ich habe dies versucht, aber es erfordert ein Passwort für den Service-Benutzer, die ich nie festlegen möchte. 'sudo -u ' auf der anderen Seite, nicht. Beachten Sie, dass ich diese mit meinem Benutzerkonto und nicht mit einem root-Konto ausführe. –

+0

sudo funktioniert nicht, wenn 'requetty' in/etc/sudoers gesetzt ist (der Standard in Cent 6, 7 und Fedora 20). – spuder

+0

Das gleiche Problem hier, cant Benutzer su, weil es ein Passwort erfordert. Was ist der beste Ansatz dafür? Niemand scheint eine richtige Antwort zu haben :( – gromit190

10

Für System-Style-Init-Skripte ist es wirklich einfach. Sie fügen einfach einen Benutzer = im Abschnitt [Service] hinzu.

Hier ein Init-Skript, das ich für qbittorrent-nox verwenden auf 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 kann kontrovers sein, aber das ist sicherlich ein netter Ich werde das für meinen (hashicorp) Vault-Server-Prozess tun Danke, – David

+0

Ich komme nicht wirklich mit Linux Dev-Drama mit :) Ich habe gerade Systemd einfach zu behandeln, seit Centos es angenommen. Ich gehe nie zurück zu dem Durcheinander, das vorausgegangen ist :) – LOAS