如何使用 polkit 0.106 發送通知?
我正在開發一個應用程序,不要忘記 pendrive。
如果 pendrive 連接到機器,此應用程序必須鎖定關機。在這種形式中,如果使用者想在連接筆式驅動器時關閉系統,系統會顯示一條通知,提醒它必須斷開筆式驅動器才能解鎖關機。
為了檢測關機事件,我設置了一個 polkit 規則,它呼叫一個腳本來檢查是否有任何 pendrive 連接到系統。
如果有任何 pendrive 連接,則 polkit 規則通過腳本呼叫 notify-send,該腳本
send_notify.sh
執行以下命令:
notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000
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
沒有向我的使用者顯示通知。我該如何解決這個問題?
更新:
我試圖修改腳本是這樣的:
#!/bin/bash user=$1 XAUTHORITY="/home/$user/.Xauthority" DISPLAY=$( who | grep -m1 $user.*\( | awk '{print $5}' | sed 's/[(|)]//g') notify-send "Extract Pendrive to enable shutdown" -t 5000 exit 0
使用者由 pòlkit 作為參數傳遞
但問題還在繼續
更新:我剛剛看到這個錯誤https://bugs.launchpad.net/ubuntu/+source/libnotify/+bug/160598不允許以 root 身份發送通知。
稍後我將測試修改解決方法更改使用者
UPDATE2:將程式碼更改為此之後。問題繼續存在:
#!/bin/bash export XAUTHORITY="/home/$user/.Xauthority" export DISPLAY=$(cat "/tmp/display.$user") user=$1 su $user -c 'notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical'
polkit(和
pkexec
)刪除環境變數DISPLAY
和XAUTHORITY
X 訪問所需的變數。notify-send
失敗,因為它無法訪問顯示。因此,pkexec 將不允許您以另一個使用者身份執行 X11 應用程序,因為 $ DISPLAY and $ 未設置 XAUTHORITY 環境變數。如果操作上的 org.freedesktop.policykit.exec.allow_gui 註釋設置為非空值,則將保留這兩個變數
我對 polkit 不熟悉;也許你可以
org.freedesktop.policykit.exec.allow_gui
只為這個規則設置,或者還有其他的可能性。抱歉,我無法提供現成的解決方案。但是,核心點是提供
DISPLAY
和XAUTHORITY
為notify-send
.(不要打我:一個骯髒的解決方案將是硬編碼
DISPLAY=:0
並XAUTHORITY=...
在您的通知腳本中。請注意,如果發生變化,這可能會失敗)。編輯:基於上面的討論,一種解決方法應該適用於多個使用者並且沒有
XAUTHORITY
:在 X 登錄時,應該自動執行一個腳本(可能
.desktop
在 中進行一些設置~/.config/autostart
):#! /bin/bash # allow polkitd access to X. # xhost is an alternative to XAUTHORITY authentication xhost +SI:localuser:polkitd # store DISPLAY for each user echo $DISPLAY > /tmp/display.$USER
在你的 polkit 腳本中包括
export DISPLAY=$(cat /tmp/display.$user)
@mviereck
我試圖用這個內容創建一個 polkit 策略文件來通知發送
<policyconfig> <action id="org.freedesktop.notify-send"> <description>Launch notify-send command</description> <message>Authentication is required to run the gedit</message> <icon_name>accessories-text-editor</icon_name> <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>
我把這個文件放在
/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
但是,按下關機按鈕後,關機菜單需要很長時間才能顯示,並且沒有出現通知