최근 업데이트 후 Ubuntu 20.04:
$ systemctl suspend
Call to Suspend failed: Access denied
몇 주 전에는 잘 작동했는데,아니요모든 루트 권한.
다이어리:
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")
"메시지 보내기 거부"는 dbus의 "권한 거부"와 동일합니다. 권한 거부 이유는 보낸 사람, 대상, 인터페이스, 구성원에 따라 다릅니다.
간단한 검색에서는 대부분 최대 절전 모드 관련 문제가 반환되었습니다. 일방 통행(1,2) 아마도 sudoers 파일에 NOPASSWD를 추가하면 됩니다(아니요마찬가지) 하지만 그럴 것 같다.폴킷질문.
어떤 패키지 업데이트로 인해 이 동작이 발생할 수 있나요? sudoer 파일을 편집하는 것 외에 다른(아마도 더 우아한) 솔루션이 있습니까?
편집하다:
$ 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"/>
어떤 이유로 다른 유사한 일반 사용자를 사용하면 systemctl suspend -i
완벽하게 작동합니다 .
또한 시도이것그리고 Result.YES
.
사용 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")"; };
systemctl reboot
나는 / 와 같은 문제가 있습니다 RebootWithFlags
. /usr/share/dbus-1/system.d/org.freedesktop.login1.conf
(패키지의 일부 ) 에 동일한 솔루션이 추가되었습니다 systemd
.
답변1
D 버스
시스템 정지와 관련하여 dbus 정책이 있거나 구성원에 대한 비특권 접근을 명시적으로 거부 /usr/share/dbus-1/system.d
하는지 확인하세요./etc/dbus-1/system.d
org.freedesktop.login1
다음 정책을 사용하여 권한이 없는 사용자가 전화를 org.freedesktop.login1.Manager.Suspend
걸고org.freedesktop.login1.Manager.SuspendWithFlags
<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"https://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy context="default">
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="Suspend"/>
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="SuspendWithFlags"/>
</policy>
</busconfig>
이 정책 파일을 다른 이름으로 저장하고 /etc/dbus-1/system.d/org.freedesktop.login1.conf
reload dbus 데몬을 사용하세요 systemctl reload dbus
.
폴킷
일반 사용자가 인증 없이 시스템을 일시 중단할 수 있도록 다음 규칙을 추가할 수 있습니다.
// vi: ft=javascript
Array.prototype.includes = function (variable) {
for (var i = 0; i < this.length; i++) { if (this[i] === variable) return true; }
return false;
}
polkit.addRule(function (action, subject) {
if (
[
"org.freedesktop.login1.suspend",
"org.freedesktop.login1.suspend-ignore-inhibit",
"org.freedesktop.login1.suspend-multiple-sessions"
].includes(action.id) &&
// Allow user named "user_name" or users in group "wheel" to suspend this system,
// Modify accordingly to suit your system
(subject.user == "user_name" || subject.isInGroup("wheel"))
) {
return polkit.Result.YES;
}
});
"user_name"을 사용자 이름으로 변경하세요.
/etc/polkit-1/rules.d/01-suspend.rules
즉시 적용 하려면 이 규칙을 저장하세요 .
답변2
sudo systemctl suspend
루트 액세스가 필요할 수 있으므로 시도해 보십시오 .
답변3
항상 sudo를 작성하고 싶지 않다면 쉘 구성에 별칭을 추가하세요.alias "systemctl suspend"="sudo systemctl suspend"