Der beste Weg, ein System herunterzufahren, ist die Verwendung der folgenden Codes
import os
os.system('systemctl poweroff')
Viele der verfügbaren Linux-Distributionen erfordern Superuser-Privilegien, um 01
auszuführen oder 18
, aber wie kommt es dann, dass Sie, wenn Sie an Ihrem Computer sitzen, ihn ausschalten können, ohne root zu sein? Sie öffnen ein Menü und klicken auf Herunterfahren und es fährt herunter, ohne dass Sie 28
werden , richtig?
Nun... die Begründung Dahinter steht, dass Sie, wenn Sie physischen Zugriff auf den Computer haben, das Netzkabel ziehen und ihn sowieso ausschalten könnten. Heutzutage erlauben viele Distributionen das Ausschalten, obwohl sie auf den lokalen Systembus zugreifen, der über 36
43
(oder eher die Dienste, die dadurch verfügbar gemacht werden)? Es ändert sich ständig. Ich würde empfehlen, ein dbus-Viewer-Tool wie D-feet zu installieren (bitte beachten:es ist immer noch ziemlich schwer zu visualisieren, aber es kann helfen)
Werfen Sie einen Blick auf diese Dbus-Shutdown-Skripte.
Wenn Sie noch HAL in Ihrer Distribution haben (ist auf dem Weg, veraltet zu werden), versuchen Sie Folgendes:
import dbus
sys_bus = dbus.SystemBus()
hal_srvc = sys_bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
pwr_mgmt = dbus.Interface(hal_srvc,
'org.freedesktop.Hal.Device.SystemPowerManagement')
shutdown_method = pwr_mgmt.get_dbus_method("Shutdown")
shutdown_method()
Dies funktioniert auf einem Ubuntu 12.04 (ich habe gerade meinen Computer ausgeschaltet, um sicherzustellen, dass es funktioniert). Wenn Sie etwas Neueres haben ... nun, es funktioniert möglicherweise nicht. Das ist der Nachteil dieser Methode:Sie ist sehr verteilungsspezifisch.
Möglicherweise müssen Sie den 58
installieren Paket, damit dies funktioniert (http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html)
AKTUALISIERUNG 1:
Ich habe ein wenig recherchiert und es sieht so aus, als ob dies in neueren Ubuntu-Versionen über ConsoleKit erfolgt. Ich habe den folgenden Code in meinem Ubuntu 12.04 (das die veraltete HAL und das neuere ConsoleKit hat) getestet und es hat meinen Computer heruntergefahren:
>>> import dbus
>>> sys_bus = dbus.SystemBus()
>>> ck_srv = sys_bus.get_object('org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager')
>>> ck_iface = dbus.Interface(ck_srv, 'org.freedesktop.ConsoleKit.Manager')
>>> stop_method = ck_iface.get_dbus_method("Stop")
>>> stop_method()
AKTUALISIERUNG 2:
Wahrscheinlich warum können Sie dies tun, ohne 63
zu sein verdient eine etwas umfassendere Erklärung. Konzentrieren wir uns auf das neuere 75
(88
ist viel komplizierter und chaotischer, IMHO).
Die 94
ist ein Dienst, der als 107
ausgeführt wird in Ihrem System:
[email protected]:/tmp$ ps aux|grep console-kit
root 1590 0.0 0.0 1043056 3876 ? Sl Dec05 0:00 /usr/sbin/console-kit-daemon --no-daemon
Jetzt 115
ist nur ein Nachrichtenübermittlungssystem. Sie haben einen Dienst wie ConsoleKit das eine Schnittstelle für 126
verfügbar macht . Eine der exponierten Methoden ist 131
(oben gezeigt). ConsoleKit Die Berechtigungen von werden mit PolKit gesteuert , das (obwohl es auf regulären Linux-Berechtigungen basiert) eine etwas feinere Steuerung für "wer kann was" bietet . Zum Beispiel PolKit kann Dinge sagen wie "Wenn der Benutzer am Computer angemeldet ist, dann erlaube ihm, etwas zu tun. Wenn er remote verbunden ist, dann lass es." . Wenn PolKit bestimmt, dass Ihr Benutzer ConsoleKit aufrufen darf ist 148
-Methode wird diese Anfrage weitergeleitet (oder durch ) 158
zu ConsoleKit (was anschließend Ihren Computer herunterfährt, weil es das kann ... weil es sich lohnt ... weil es 167
ist )
Weiterführende Literatur:
- Was sind ConsoleKit und PolicyKit? Wie funktionieren sie?
- ArchWiki-PolKit
Zusammenfassend:Sie können einen Computer nicht ausschalten, ohne 170
zu sein . Aber Sie können einen Dienst erkennen, der als 180
ausgeführt wird um das System für Sie herunterzufahren.
AKTUALISIERUNG 3:
Im Dezember 2021, sieben Jahre nachdem die ursprüngliche Antwort geschrieben wurde, musste ich dies erneut tun. Diesmal in einem Ubuntu 18.04.
Wenig überraschend scheinen sich die Dinge ein wenig geändert zu haben:
- Die PowerOff-Funktionalität scheint über einen neuen
194
gehandhabt zu werden Dienst, der Teil des """neuen""" (hust! hust!) ist SystemD Maschinen . - Der
208
Das Python-Paket scheint veraltet und/oder als "veraltet" angesehen worden zu sein. Es gibt jedoch eine neue PyDbus-Bibliothek, die stattdessen verwendet werden kann.
Wir können also immer noch Maschinen mit einem nicht privilegierten Skript ausschalten:
#! /usr/bin/python3
from pydbus import SystemBus
bus = SystemBus()
proxy = bus.get('org.freedesktop.login1', '/org/freedesktop/login1')
if proxy.CanPowerOff() == 'yes':
proxy.PowerOff(False) # False for 'NOT interactive'
Aktualisierung 3.1:
Es sieht so aus, als wäre es nicht wie neu wie ich dachte X-D
Es gibt bereits eine Antwort von @Roeften in genau diesem Thread.
BONUS :
Ich habe in einem Ihrer Kommentare gelesen, dass Sie den Computer nach einer zeitraubenden Aufgabe ausschalten möchten, um zu verhindern, dass er überhitzt ... Wussten Sie, dass Sie wahrscheinlich können Schalten Sie es zu einem bestimmten Zeitpunkt mit RTC ein? (Siehe dies und das) Ziemlich cool, äh? (Ich war so aufgeregt, als ich herausfand, dass ich das kann...) :-D
import os
os.system("shutdown now -h")
Führen Sie Ihr Skript mit Root-Rechten aus.
irgendeine Möglichkeit zum Herunterfahren ... ohne erhöhte Rechte?
Nein, gibt es (zum Glück!) nicht.
Denken Sie daran, dass Sie mehrere Systemfunktionen verwenden können, um die Rechteerweiterung für normale Benutzer zu vereinfachen:
213
224
233