GNU/Linux >> Tutoriales Linux >  >> Linux

apagar la computadora (linux) usando python

La mejor manera de apagar un sistema es usar los siguientes códigos

import os
os.system('systemctl poweroff') 

Muchas de las distribuciones de Linux que existen requieren privilegios de superusuario para ejecutar shutdown o halt , pero entonces, ¿cómo es que si está sentado en su computadora puede apagarla sin ser root? Abre un menú, presiona Apagar y se apaga sin que te conviertas en root , ¿verdad?

Bueno... la razón detrás de esto es que si tiene acceso físico a la computadora, podría tirar del cable de alimentación y apagarlo de todos modos, por lo que hoy en día, muchas distribuciones permiten el apagado a través del acceso al bus del sistema local accesible a través de dbus . Problema con dbus (o los servicios expuestos a través de él, más bien)? Está cambiando constantemente. Recomendaría instalar una herramienta de visualización de dbus como D-feet (tenga en cuenta:aún es bastante difícil de visualizar, pero puede ayudar)

Eche un vistazo a estos scripts de apagado de Dbus.

Si aún tiene HAL en su distribución (está en camino de quedar obsoleto), intente esto:

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()

Esto funciona en un Ubuntu 12.04 (acabo de apagar mi computadora para asegurarme de que funcionó). Si tienes algo más nuevo... bueno, puede que no funcione. Es la desventaja de este método:es muy específico para la distribución.

Puede que tenga que instalar el dbus-python paquete para que esto funcione (http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html)

ACTUALIZACIÓN 1:

He estado investigando un poco y parece que esto se hace en las versiones más nuevas de Ubuntu a través de ConsoleKit. Probé el siguiente código en mi Ubuntu 12.04 (que tiene el HAL obsoleto y el ConsoleKit más nuevo) y apagó mi computadora:

>>> 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()

ACTUALIZACIÓN 2:

Probablemente por qué puedes hacer esto sin ser root merece una explicación un poco más amplia. Centrémonos en el nuevo ConsoleKit (HAL es mucho más complicado y desordenado, en mi humilde opinión).

El ConsoleKit es un servicio que se ejecuta como root en su sistema:

[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

Ahora, d-bus es solo un sistema de paso de mensajes. Tiene un servicio, como ConsoleKit que expone una interfaz a d-bus . Uno de los métodos expuestos es el Stop (mostrado anteriormente). Juego de consola Los permisos de se controlan con PolKit , que (a pesar de estar basado en permisos regulares de Linux) ofrece un control un poco más fino para "quién puede hacer qué" . Por ejemplo, PolKit puede decir cosas como "Si el usuario ha iniciado sesión en la computadora, permítale hacer algo. Si está conectado de forma remota, no lo haga". . Si PolKit determina que su usuario puede llamar a ConsoleKit de Stop método, esa solicitud será pasada por (o a través de ) d-bus a ConsoleKit (que posteriormente apagará su computadora porque puede... porque vale la pena... porque es root )

Lectura adicional:

  • ¿Qué son ConsoleKit y PolicyKit? ¿Cómo funcionan?
  • ArchWiki PolKit

Para resumir:no puede apagar una computadora sin estar root . Pero puedes decir que un servicio se está ejecutando como root para apagar el sistema por usted.

ACTUALIZACIÓN 3:

En diciembre de 2021, siete años después de que se escribiera la respuesta original, tuve que hacer esto nuevamente. Esta vez, en un Ubuntu 18.04.

Como era de esperar, las cosas parecen haber cambiado un poco:

  • La funcionalidad PowerOff parece manejarse a través de un nuevo org.freedesktop.login1 servicio, que es parte del """nuevo""" (¡tos! ¡tos!) SystemD maquinaria .
  • El dbus El paquete de Python parece haber quedado obsoleto y/o considerado "heredado". Sin embargo, hay una nueva biblioteca de PyDbus para usar en su lugar.

Por lo tanto, aún podemos apagar las máquinas con un script sin privilegios:

#! /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'

Actualización 3.1:

Parece que no es como nuevo como pensaba X-D

Ya hay una respuesta de @Roeften en este mismo hilo.

BONO :

Leí en uno de sus comentarios que desea apagar la computadora después de una tarea que requiere mucho tiempo para evitar que se sobrecaliente... ¿Sabía que probablemente encenderlo en un momento dado usando RTC? (Ver esto y esto) Bastante bien, ¿eh? (Me emocioné tanto cuando descubrí que podía hacer esto... ) :-D


import os
os.system("shutdown now -h")

ejecute su script con privilegios de root.


alguna forma de cerrar... sin privilegios elevados?

No, no lo hay (¡afortunadamente!).

Tenga en cuenta que puede usar varias funciones del sistema para facilitar la escalada de privilegios para los usuarios normales:

  • sudo
  • setuid
  • setcap

Linux
  1. Cómo instalar Python en Linux

  2. ¿Cómo verificar si un proceso todavía se está ejecutando usando Python en Linux?

  3. Actualice python en linux 2.7 a 3.5

  4. ¿Cómo apagar una computadora que tiene una dirección IP particular?

  5. ¿Los servidores Linux que usan AD/Kerberos para autenticación/autorización necesitan cuentas de computadora?

Instalar python 3 en Redhat 8

Escritura sin distracciones en Linux usando FocusWriter

Encuentre detalles del sistema Linux usando Python

Instale MongoDB usando Vagrant en Linux

Cómo instalar Python en Linux Mint 20

Usando el comando Watch en Linux