Quando tento desligar o computador a partir de uma linha de comando ou terminal, devo ter privilégios de root:
amy@amy:~$ shutdown now
shutdown: Need to be root
e
amy@amy:~$ halt
halt: Need to be root
mas ao desligar usando a interface gráfica do usuário, ou seja, o botão de desligamento ou o botão de desligamento de hardware, não é solicitada a senha para isso. O que é esse desligamento para a interface gráfica e por que não precisa dos privilégios de senha ou root?
Estou usando o Ubuntu 11.04 Natty.
Respostas:
O botão liga / desliga do hardware aciona um evento ACPI ao qual
acpid
(o daemon ACPI) percebe e reage; nesse caso, desligando o sistema, embora você possa fazer o que quiser. O daemon ACPI é executado como root, portanto, ele tem permissão para desligar o sistema. Os ambientes de área de trabalho (por exemplo,gdm
para o Gnome) geralmente também são executados como root, então eu suspeito que eles funcionem da mesma maneira - você não tem permissão para desligar o sistema, mas pode dizergdm
que deseja desligar e pode fazê-lo seu nomefonte
acpid
fazer algo diferente do que já faz, você teria que ser root, para ter permissão para fazer coisas inseguras. Também é possível usar sistemas MAC como o SELinux para protegeracpid
, restringindo as coisas que eles podem fazer, mesmo enquanto executam como root.acpid
é configurável, ele pode executar scripts diferentes, dependendo dos eventos de hardware que vê (por exemplo, eu tenhoacpid
bloquear meu computador quando eu bati o botão de energia)A resposta de Michael discute corretamente a função do sistema ao usar o botão liga / desliga do hardware, mas a maioria dos ambientes de área de trabalho realmente usa
dbus
esse objetivo, em vez de fazê-lo. Por exemplo, o GNOME usadbus
'sorg.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
quando o botão de desligamento é clicado. Quando isso é enviado,dbus
faz algumas verificações para determinar se o usuário que está enviando a mensagem está autorizado a executar um desligamento e, se houver, encerra o sistema.Você pode emular isso usando
dbus-send
. Por exemplo, para desligar o sistema usandodbus
, use algo como isto:fonte