GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Herunterfahren des Computers (Linux) mit Python

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 . Problem mit 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

Linux
  1. Debuggen Sie Linux mit ProcDump

  2. So installieren Sie Python unter Linux

  3. Wie kann ich mit Python unter Linux überprüfen, ob ein Prozess noch läuft?

  4. Simulieren des Key Press-Ereignisses mit Python für Linux

  5. So erstellen Sie einen Benutzer unter Linux mit Python

Installieren Sie Python 3 auf Redhat 8

Ablenkungsfreies Schreiben unter Linux mit FocusWriter

Finden Sie Linux-Systemdetails mit Python

Installieren Sie MongoDB mit Vagrant unter Linux

Verwenden des Watch-Befehls unter Linux

Benötigen Linux-Server, die AD/Kerberos zur Authentifizierung/Autorisierung verwenden, Computerkonten?