最近のアップデート後、Ubuntu 20.04:
$ systemctl suspend
Call to Suspend failed: Access denied
数週間前にはうまくいきましたが、いいえすべてのroot権限。
日記:
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"