Cuando intento apagar la computadora desde una línea de comando o terminal, debo tener privilegios de root:
amy@amy:~$ shutdown now
shutdown: Need to be root
y
amy@amy:~$ halt
halt: Need to be root
pero cuando se apaga usando la interfaz gráfica de usuario, es decir, el botón de apagado o el botón de apagado del hardware, no se me solicita la contraseña para hacerlo. ¿Qué significa el apagado de la interfaz gráfica y por qué no necesita la contraseña o los privilegios de root?
Estoy usando Ubuntu 11.04 Natty.
Respuestas:
El botón de encendido del hardware activa un evento ACPI que
acpid
(el demonio ACPI) nota y reacciona; en este caso apagando el sistema, aunque podría hacer que haga lo que quiera. El daemon ACPI se ejecuta como root, por lo que tiene permiso para apagar el sistema. Los entornos de escritorio (por ejemplo,gdm
para Gnome) generalmente también se ejecutan como root, por lo que sospecho que funcionan de la misma manera: no tiene permiso para apagar el sistema, pero puede decirgdm
que quiere que se apague y puede hacerlo en su nombrefuente
acpid
hacer algo diferente de lo que ya hace, tendría que ser root, por lo que ya tendría permiso para hacer cosas inseguras. También es posible usar sistemas MAC como SELinux para protegeracpid
, restringiendo las cosas que se les permite hacer, incluso mientras se ejecutan como root.acpid
es configurable, puede ejecutar diferentes scripts dependiendo de los eventos de hardware que vea (por ejemplo, heacpid
bloqueado mi computadora cuando presiono el botón de encendido)La respuesta de Michael discute correctamente la función del sistema cuando se usa el interruptor de encendido de hardware, pero la mayoría de los entornos de escritorio en realidad lo usan
dbus
para este propósito en lugar de hacerlo ellos mismos. Por ejemplo, GNOME usadbus
'sorg.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
cuando se hace clic en el botón de apagado. Cuando se envía esto,dbus
realiza algunas comprobaciones para determinar si el usuario que envía el mensaje está autorizado para realizar un apagado y, si lo están, apaga el sistema.Puedes emular esto usando
dbus-send
. Por ejemplo, para apagar su sistema usandodbus
, use algo como esto:fuente