Linux

如何使用 polkit 0.106 發送通知?

  • March 23, 2018

我正在開發一個應用程序,不要忘記 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)刪除環境變數DISPLAYXAUTHORITYX 訪問所需的變數。notify-send失敗,因為它無法訪問顯示。

pkexec 手冊頁

因此,pkexec 將不允許您以另一個使用者身份執行 X11 應用程序,因為 $ DISPLAY and $ 未設置 XAUTHORITY 環境變數。如果操作上的 org.freedesktop.policykit.exec.allow_gui 註釋設置為非空值,則將保留這兩個變數

我對 polkit 不熟悉;也許你可以org.freedesktop.policykit.exec.allow_gui只為這個規則設置,或者還有其他的可能性。抱歉,我無法提供現成的解決方案。

但是,核心點是提供DISPLAYXAUTHORITYnotify-send.

(不要打我:一個骯髒的解決方案將是硬編碼DISPLAY=:0XAUTHORITY=...在您的通知腳本中。請注意,如果發生變化,這可能會失敗)。


編輯:基於上面的討論,一種解決方法應該適用於多個使用者並且沒有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

但是,按下關機按鈕後,關機菜單需要很長時間才能顯示,並且沒有出現通知

引用自:https://unix.stackexchange.com/questions/425211