如何允许使用 pkexec 以另一个用户身份运行通知发送?

如何允许使用 pkexec 以另一个用户身份运行通知发送?

作为这个问题的延续(如何使用 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-sendsend_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 可以从我的脚本中调用 notification-send ?

答案1

经过一些测试,我得到了这个结果:

  • 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 中的另一个用户身份启动命令

相关内容