Erlaube "systemctl halt" für alle Benutzer? (systemd + debian)

1286
David Stark

Kann man "systemctl halt" für alle Benutzer zulassen?

Derzeit nur die Befehle:

systemctl poweroff & systemctl reboot work on my system (Debian Jessie) 

Wenn ich systemctl halt als normaler Benutzer anrufe, erhalte ich die folgende Meldung:

Failed to start halt.target: Access denied 

Ich habe folgende Methoden ausprobiert:

  1. Methode - Ich habe versucht, eine neue Aktion in: /usr/share/polkit-1/actions/org.freedesktop.login1.policy hinzuzufügen

Ich habe die Aktion kopiert

<action id="org.freedesktop.login1.power-off"> to <action id="org.freedesktop.login1.halt"> 
  1. Methode (und welche funktionierte) war chmod u + s / sbin / halt, aber da / sbin / halt ein Link zu -> / bin / systemctl ist, ist dies wahrscheinlich keine gute Idee
0
Beachten Sie, dass "halt" und "systemctl halt" zwei verschiedene Befehle sind. Selbst wenn jemand ein Symlink zum anderen ist, verhalten sie sich trotzdem anders. grawity vor 7 Jahren 0

1 Antwort auf die Frage

2
grawity

Schritt 1: Warten Sie einige Monate, bis Debian Stretch veröffentlicht wird. Sie benötigen mindestens systemd v227 mit den Commits 2ac3930f (Polkit-Prüfung für /sbin/halt) und 88ced61b (erweiterte Polkit-Daten systemctl haltusw.).

Schritt 2: Erstellen Sie eine Polkit-Regel in…Nein, das reicht nicht aus, denn auch Stretch hat noch Polkit v0.105, das die JS-basierten Regeln noch nicht unterstützte. nur das wesentlich limitiertere .pklaFormat. Das heißt, v0.113 ist schließlich in "experimentell".

Wenn Sie jedoch ein Upgrade auf systemd ≥v227 und polkit ≥v0.113 durchführen, sollte eine Regel wie diese funktionieren:

/* copy to /etc/polkit-1/rules.d/systemd-allow-halt.rules */  polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "halt.service") { return polkit.Result.YES; } }); 

Also lehre dich systemctl poweroffstattdessen zu tippen . "Halt" ist nicht der normale Befehl zum Herunterfahren. Es ist der Befehl, die Maschine buchstäblich anzuhalten - ohne sie auszuschalten. Das ist nicht sehr nützlich.

Wenn Sie es nützlich finden, verwenden Sie stattdessen sudo :

# /etc/sudoers  ALL ALL=(root) NOPASSWD: /usr/bin/systemctl halt, /sbin/halt