Linux

如何允許使用 pkexec 作為另一個使用者執行 notify-send?

  • March 24, 2018

作為這個問題的延續(如何使用 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 以另一個使用者的身份啟動命令

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