Warum müssen wir zum Herunterfahren und Neustarten im Terminal root sein?

65

Wenn wir Pakete installieren, entfernen, aktualisieren oder Änderungen vornehmen, die Administratorrechte erfordern, werden wir zur Eingabe des Kennworts des Administrators aufgefordert, der über diese sudoRechte verfügt - dies geschieht sowohl über die Benutzeroberfläche als auch über das Terminal.

Eingabeaufforderung über GUI

Wenn wir jedoch versuchen, über das Terminal herunterzufahren und neu zu starten, wird Folgendes beanstandet root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Wir werden jedoch nie nach einem Passwort gefragt, wenn wir diese Aktionen über das Zahnrad oben rechts ausführen.

Zahnrad-Menü

Warum gibt es diese Diskrepanz?

Aditya
quelle
5
Gute Frage. Sie wissen, was ich gleich fragen würde. Mein Szenario war, das Ubuntu mit Tastenkombinationen herunterzufahren. Wenn ich eine zugewiesene Taste drücke, z. B. Strg + Super + S , wird der Befehl ausgeführt. Das sudo shutdown -h nowProblem ist jedoch, dass die Eingabe ohne Zugriffsberechtigung shutdownniemals funktioniert .. Hoffe, Sie verstehen meine Situation .. :)
Saurav Kumar

Antworten:

50

Die Abschaltung am Zahnrad prüft, ob Sie die Maschine abschalten dürfen. Dies erfolgt über PolicyKit. Im Falle eines Herunterfahrens wird diese Anweisung in der Datei /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyüberprüft:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

Das PolicyKit löst einen dbus-sendBefehl aus. Im Falle eines Herunterfahrens wäre es:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

Im Hintergrund wird ein Daemon mit Root-Rechten ausgeführt, der den Befehl shutdown für Sie aufruft.

Wenn Sie in der Lage sein möchten, die Maschine "auf die alte Art" über die Befehlszeile ( shutdown, reboot, halt, ...) herunterzufahren, müssen Sie diesen Befehlen das suid-Bit hinzufügen. Beachten Sie jedoch, dass jeder auf Ihrem System, der Zugriff auf die Shell hat, Ihren Computer herunterfahren kann.

Chaos
quelle
14
Eine etwas sicherere Option wäre, Sudoern das kennwortlose Herunterfahren usw. zu ermöglichen. Dies ist einfach zu bewerkstelligen: Eingeben sudo visudo, Hinzufügen %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, Speichern und Beenden. Auf diese Weise ist ein Neustart über die Befehlszeile weiterhin erforderlich sudo reboot, Sie müssen jedoch kein Kennwort eingeben.
Sebastian Thürrschmidt
27

Ubuntu ist eine Distribution des GNU / Linux-Betriebssystems, das wiederum zur Unix-Systemfamilie gehört - eine gemeinsame Architektur für eine Reihe moderner Betriebssysteme.

Normalerweise lief Unix auf Großrechnern. Zentrale Computereinrichtungen, die Dutzende oder Hunderte von Benutzern über entfernte Terminals bedienen. Da alle Benutzer auf die Verfügbarkeit des Mainframes angewiesen waren, durfte kein einzelner Benutzer einen Befehl zum Herunterfahren ausgeben. Eine Idee, die für die Unix-Architektur von grundlegender Bedeutung ist: Der Systemkern initialisiert niemals ein Herunterfahren, es sei denn, die entsprechende Funktion wird von einem Superuser-Prozess aufgerufen.

In modernen Desktopsystemen haben Entwickler bestimmte Anstrengungen unternommen, um das Herunterfahren nur dem Desktop-Benutzer zur Verfügung zu stellen. Eine übliche Technik besteht darin, den Anmeldemanager, der normalerweise im Sicherheitskontext des Root-Benutzers ausgeführt wird, das Herunterfahren und den Neustart durchführen zu lassen. In diesem Fall fordert die grafische Shell den Anmeldemanager auf, den Computer herunterzufahren. Dies beinhaltet die Verwendung von IPC (Inter Process Communication), normalerweise über den dbus-Dienst.

Das oben erwähnte Policykit erweitert diesen Prozess um ein standardisiertes Framework, mit dem der Login-Manager (oder ein anderes Programm, das den Shutdown-Service bereitstellt) überprüfen kann, welche Benutzer einen Shutdown verursachen dürfen, und über das ein Administrator diese Berechtigungen konfigurieren kann.

Einige Desktop-Umgebungen verwenden keine IPC-basierten Dienste, sondern eine Reihe von Hilfsprogrammen, um dieselben oder ähnliche Funktionen bereitzustellen. Diese Hilfsprogramme werden über Mechanismen aufgerufen, die es ermöglichen, in den Superuser-Kontext zu wechseln, z. B. sudo, suid oder einen Policykit-Mechanismus, der sudo ähnelt.

In jedem Fall funktioniert das dumme traditionelle Shutdown-Programm auf der Shell nicht so. Sie müssen sicherstellen, dass es in einem Superuser-Kontext ausgeführt wird.

Paul Hänsch
quelle
14

Da Linux häufig als Server oder ähnliches verwendet wird, ist das Einbinden von SSH in eine Linux-Box, selbst ein normaler Ubuntu-Laptop, durchaus üblich.

Möglicherweise möchten Sie nicht, dass Personen mit SSH-Zugriff das System herunterfahren können, insbesondere wenn andere Benutzer remote angemeldet sind, die es verwenden. Jemand mit Zugriff auf die GUI - nun, er kann sie auf jeden Fall mit dem physischen Ein- / Ausschalter selbst herunterfahren.

Außerdem kann ein remote angemeldeter Benutzer die Funktion nicht wieder aktivieren.

Manishearth
quelle
Es ist mir damals nicht in den Sinn gekommen, als ich diese Frage gestellt habe, aber ich nehme an, es gibt Optionen in Ubuntu, um GUI-Pakete auf einem Remote-Server zu installieren und den Remote-Server über die GUI anstelle der Befehlszeile zu verwenden. (Ähnlich wie Windows Remote Desktop oder Teamviewer). Das würde also die Annahme zunichte machen, dass jemand, der Ubuntu über die GUI verwendet, mit dem physischen Ein- / Ausschalter herunterfahren kann.
Aditya
@aditya, für den der Server auf diese Weise eingerichtet werden muss, was der Administrator entscheiden muss
Manishearth
Ja. Es wären Root-Rechte erforderlich, um die Pakete installieren und nach Bedarf konfigurieren zu können. Aber dieses Szenario kam mir gestern beim Lesen Ihrer Antwort in den Sinn und ich dachte, ich würde es mit Ihnen teilen :-)
Aditya
14

Wenn ich über die GUI neu starte, kann ich das ohne mein sudoPasswort tun .

Nur wenn Sie der einzige angemeldete Benutzer sind. Wenn andere Benutzer (einschließlich Konsolenbenutzer) vorhanden sind, müssen Sie möglicherweise ein Root-Kennwort eingeben. Dies gilt auch für OS X und neuere Windows-Versionen.

Warum ist das so? Was passiert dort intern im Ubuntu-System?

Der folgende Befehl:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus ist ein IPC-Mechanismus - ein Medium für die lokale Kommunikation zwischen Prozessen, die auf demselben Host ausgeführt werden.

D-Bus ist "intelligenter" als Low-Level-Message-Passing-Protokolle wie UDP. Auf der anderen Seite werden Nachrichten als diskrete Elemente übertragen, nicht als fortlaufende Datenströme.

D-Bus verfügt über eine strukturierte Ansicht der von ihm übertragenen Daten und verarbeitet Daten in binärer Form. ganzzahlige Zahlen mit verschiedenen Breiten, Zeichenfolgen usw. Da Daten für D-Bus nicht nur "unformatierte Bytes" sind, können Nachrichten validiert werden.

- Freier Desktop

Warum shutdownprüft der Befehl nicht einfach, ob jemand angemeldet ist? Um ehrlich zu sein, scheint das ein ungewöhnliches Merkmal zu sein. Ich kann mir vorstellen, dass es manchmal Zeit spart, aber eine konsistente Konsole wird oft bevorzugt. Ich möchte nicht, dass Befehle manchmal ein Kennwort erfordern, nachdem sie ausgeführt wurden, und manchmal nicht.

Meine Pronomen sind Er / Ihn

Tim
quelle
Es gibt auch eine kürzere Version über die qdbus-App
Sergiy Kolodyazhnyy
Beim Herunterfahren / Abmelden von einem DE (in diesem Fall GNOME) werde ich sudoweder bei einem über GDM angemeldeten Benutzer noch bei einem über tty angemeldeten Benutzer nach dem Root- / Benutzerkennwort gefragt .
Kos
@kos hu, das ist komisch. Dieser Screenshot ist von Gnome 3, und ich bin auf gui und tty
Tim
Ich meine, ich bekomme die gleiche Meldung, aber wenn ich auf "Ausschalten" klicke, wird das System heruntergefahren. Ich habe Fabby auch gebeten, dies zu testen, und das Gleiche gilt auch für ihn, nicht sicher, worum es geht.
Kos
@kos ohh. Hu warte.
Tim
9

Der Grund, warum Sie nicht als Root angemeldet sein müssen, um ein Herunterfahren über die grafische Benutzeroberfläche zu initiieren, ist für den typischen Desktop-Benutzer im Wesentlichen eine Frage der Bequemlichkeit. Das System weiß, dass Sie der Benutzer sind, der an der Konsole angemeldet ist. Wenn Sie den Computer also versehentlich herunterfahren, können Sie ihn vermutlich wieder einschalten.

Für einen Benutzer in der Shell sind Sie möglicherweise remote angemeldet. Das System erfordert daher, dass Sie als Root angemeldet sind, um einen Befehl zum Herunterfahren auszugeben. Auf diese Weise wird verhindert, dass ein regulärer Benutzer, der bei einem Server angemeldet ist, diesen herunterfährt, während andere ihn verwenden, und während nicht unbedingt jemand physisch da ist, um die Sicherung des Computers zu starten.

Der Grund, warum das Herunterfahren keine GUI-Eingabeaufforderung für das Super-User-Passwort bietet, ist wahrscheinlich, dass dort kein echtes Dienstprogramm verfügbar ist. Wenn Sie sich an der Konsole befinden, an der die Eingabeaufforderung angezeigt wird, können Sie einfach das Zahnrad verwenden. Wheeel-Menü statt. Wenn Sie eine Eingabeaufforderung für das Superuser-Kennwort zum Herunterfahren haben möchten, ist diese bereits mit "sudo shutdown" verfügbar.

Mark Bessey
quelle
5

In einem Mehrbenutzersystem möchten Sie als Letztes Ihre Benutzer anmelden und den Server jederzeit nach dem Zufallsprinzip neu starten können. Daher ist die Befehlszeilenversion von Reboot ein reiner Superuser-Befehl, bei dem Sie als root oder angemeldet sein müssen Sudo-Rechte haben.

Ebenso die Befehle Halt und PowerOff.

Jeff Sereno
quelle
2
Vielen Dank für Ihre Antwort. Ich verstehe, dass ich als Benutzer eines von Dutzenden verwendeten Computers nicht in der Lage sein sollte, den Computer neu zu starten. Was macht Ubuntu (oder so ziemlich alle Desktop-Distributionen), wenn ich mich für einen Neustart mit der Maus entscheide anstelle der Tastatur? Sie erlauben das ohne Privilegien.
Asco
3
Mit Komponenten wie systemctl, loginctl, systemd, systemrichtlinien usw. kann der aktuell angemeldete Benutzer auf bestimmte Stammfunktionen zugreifen, ohne explizit einen Stammzugriff zu benötigen, um den Desktop benutzerfreundlicher zu gestalten. Diese Funktionen rufen jedoch nicht unbedingt die Befehlszeile auf Befehle zum Ausführen dieser Aufgaben.
Jeff Sereno