2015-12-08 5 views
13

Ich habe einen Dienst, den ich mit Systemstart starten möchte. Ich habe dafür eine ap @ .service-Definition als Vorlage erstellt, weil es viele Instanzen geben kann.Kann ich ein Benutzer system mit 'systemctl --user' nach sudo su - myuser steuern?

Definiert in der Root-Systemd, das funktioniert gut, und startet und stoppt den Dienst mit dem System. Die Dienstinstanz wird wie erwartet mit systemctl enable [email protected] installiert. Root kann den Dienst auch ohne Probleme starten und stoppen. Der Dienst wird in einem eigenen Konto (myuser), nicht root, ausgeführt, das von User = myuser in der ap @ .service-Vorlage gesteuert wird.

Aber ich möchte Benutzer 'myuser' in der Lage sein, ihren eigenen Dienst zu starten und zu stoppen, ohne die Systemsicherheit zu kompromittieren.

Ich wechselte zu einem Benutzer systemd, und aktiviert Verweilen mit loginctl enable-linger myuser. Ich aktiviere dann den im Verzeichnis ~ myuser/.config/systemd/user definierten Dienst. Der Dienst startet und stoppt sauber mit dem System, wie vorgesehen. Wenn ich mich bei einem Terminal als 'myuser' anmelde, funktionieren systemctl --user start [email protected] und systemctl --user stop [email protected] beide perfekt.

Wenn ich jedoch als ein anderer Benutzer anmelden (Benutzer2) und sudo su - myuser in einem Terminal ausführen, dann systemctl --user Befehle jetzt mit der Fehlermeldung fehlgeschlagen "D-Bus-Verbindung fehlgeschlagen: keine solche Datei oder Verzeichnis".

Wie aktiviere ich systemctl --user um nach einem sudo su - myuser Befehl zu arbeiten, um den Benutzer zu wechseln?

+0

Ist Ihr CWD immer noch das Home-Verzeichnis des anderen Benutzers? Einige Dienstprogramme haben Probleme, wenn der aufrufende Benutzer keine Berechtigung zum Anzeigen des aktuellen Verzeichnisses hat. – Dave

+0

Hi Dave ... das Home-Verzeichnis hat gewechselt, erzwungen durch den - im sudo-Befehl. Das CWD wurde in das Home-Verzeichnis des neuen Benutzers geändert. – NeilCasey

+0

Ah OK. Ignorier mich dann. – Dave

Antwort

13

Ich fand die Antwort auf einer anderen Website mit weiteren Suchvorgängen mit anderen Begriffen.

Die benötigten Lösungen waren, die Shell mit Informationen zu versorgen, um den richtigen DBUS für den Benutzer zu erreichen.

Durch Hinzufügen der folgenden Umgebungsvariablen zur Shell vor dem Ausführen von systemctl --user wird das DBUS-Problem beseitigt, und systemctl funktioniert ordnungsgemäß.

export XDG_RUNTIME_DIR="/run/user/$UID" 
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" 

Um sicherzustellen, dass die DBUS_SESSION_BUS_ADDRESS in dem sudo-Shell zur Verfügung steht, habe ich die Umgebungsvariablen zu ~/.bash_profile der Ziel Benutzer-ID. Dies erfordert, dass eine Login-Shell (sudo su - myuser oder sudo -l myuser) erstellt wird, um die richtige Umgebung zu erstellen.

Alternativ können Sie die Erstellung der Umgebungsvariablen zu ~/.bashrc hinzufügen (oder eine Entsprechung für andere Shells). Die Umgebung wird dann für alle Muschelkreationen neu festgelegt.

Verwandte Themen