Após uma atualização recente em um Ubuntu 20.04:
$ systemctl suspend
Call to Suspend failed: Access denied
Algumas semanas atrás funcionou bem dessa maneira, sem privilégios de root.
No diário:
dbus-daemon[1310]: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.991" (uid=1000 pid=683426 comm="systemctl suspend " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")
A "mensagem de envio rejeitada" é o equivalente dbus de "permissão negada". E o motivo pelo qual a permissão é negada depende do remetente, do destino, da interface e do membro.
Uma pesquisa simples retorna principalmente problemas relacionados ao hibernate. Uma maneira ( 1 , 2 ) poderia ser adicionar NOPASSWD ao arquivo sudoers ( não é o mesmo), mas parece um problema de polkit .
Qual atualização de pacote causa esse comportamento? Existe outra solução (talvez mais elegante) além de editar o arquivo sudoer?
Editar :
$ grep -ri org.freedesktop.login1.suspend /usr/share/polkit-1/
/usr/share/polkit-1/actions/org.freedesktop.login1.policy: <action id="org.freedesktop.login1.suspend">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy: <action id="org.freedesktop.login1.suspend-multiple-sessions">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy: <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.suspend</annotate>
/usr/share/polkit-1/actions/org.freedesktop.login1.policy: <action id="org.freedesktop.login1.suspend-ignore-inhibit">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy: <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.suspend</annotate>
$ grep -i suspend /usr/share/dbus-1/system.d/org.freedesktop.login1.conf
send_member="Suspend"/>
send_member="SuspendThenHibernate"/>
send_member="CanSuspend"/>
send_member="CanSuspendThenHibernate"/>
Por alguma razão, usar outro usuário regular semelhante systemctl suspend -i
funciona perfeitamente.
Tentei também isso com Result.YES
.
Usando busctl monitor
:
‣ Type=error ... Sender=org.freedesktop.DBus Destination=:1.4594
ErrorName=org.freedesktop.DBus.Error.AccessDenied ErrorMessage="Rejected send message, 2 matched rules; type="method_call", sender=":1.4594" (uid=1000 pid=636652 comm="systemctl suspend -i " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")"
MESSAGE "s" { STRING "Rejected send message, 2 matched rules; type="method_call", sender=":1.4594" (uid=1000 pid=636652 comm="systemctl suspend -i " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")"; };
Tente
sudo systemctl suspend
porque você pode precisar ser root.D-Bus
Verifique se não há políticas dbus
/usr/share/dbus-1/system.d
ou/etc/dbus-1/system.d
que explicitamente neguem acesso não privilegiado a membrosorg.freedesktop.login1
relacionados à suspensão do sistema.Você pode usar a seguinte política para permitir que usuários sem privilégios invoquem
org.freedesktop.login1.Manager.Suspend
eorg.freedesktop.login1.Manager.SuspendWithFlags
Salve este arquivo de política como
/etc/dbus-1/system.d/org.freedesktop.login1.conf
e recarregue o daemon dbus comsystemctl reload dbus
.polkit
Você pode adicionar a seguinte regra para permitir que usuários regulares suspendam o sistema sem autenticação.
Altere "user_name" para seu nome de usuário
Salve esta regra como
/etc/polkit-1/rules.d/01-suspend.rules
, ela entrará em vigor imediatamente.