如何允許使用 pkexec 作為另一個使用者執行 notify-send?
作為這個問題的延續(如何使用 polkit 0.106 發送通知?),我發現我必須以
notify-send
要發送通知的使用者身份執行。但是,使用我目前的配置,我不能這樣做,因為 polkit 以
polkitd
使用者身份執行腳本,而且我不能su $user
沒有已知的使用者密碼。因此,我需要創建一個新的 polkit 操作,以允許
notify-send
從 polkitd 以其他使用者身份執行。我的 polkit 規則是這樣的:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.consolekit.system.stop" || action.id == "org.freedesktop.login1.power-off" || action.id == "org.freedesktop.login1.power-off-multiple-sessions" || action.id == "org.xfce.session.xfsm-shutdown-helper") { try{ polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]); return polkit.Result.YES; }catch(error){ polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]); return polkit.Result.NO; } } });
此 polkit 規則必須在關機菜單中鎖定關機選項,並顯示帶有
notify-send
,send_notify.sh
腳本的通知,該腳本執行以下操作:#!/bin/bash export DISPLAY=":0" user=$1 pkexec --user $user notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical exit 0
我試圖添加這個 polkit 策略文件:
<policyconfig> <action id="org.freedesktop.notify-send"> <description>Launch notify-send command</description> <defaults> <allow_any>yes</allow_any> <allow_inactive>yes</allow_inactive> <allow_active>yes</allow_active> </defaults> <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/notify-send</annotate> <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
我把這個文件放在
/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
但是,將策略文件放入
/usr/share/polkit-1/rules.d/
並按下關機按鈕後,關機菜單需要很長時間才能顯示,並且沒有出現通知。關機選項已正確鎖定如何讓 polkit 可以從我的腳本中呼叫 notify-send?
在做了一些測試後,我得到了這個結果:
- polkitd 是 nologin 使用者
- 如果我執行此命令,以使用 polkitd 使用者執行我的腳本,則會顯示錯誤:
sudo su polkitd -s /bin/bash -c aux_scripts/send_notify.sh almu
Error executing command as another user: Not authorized
This incident has been reported.
所以,我認為 polkitd 使用者是一個受限帳戶,它不能像其他使用者一樣執行命令
作為結論,我確定如果不修改系統內部,則無法執行此操作。我不能在我的應用程序中允許這個,所以我不能從 polkit 以另一個使用者的身份啟動命令