polkit 0.106을 사용하여 알림을 보내는 방법은 무엇입니까?

polkit 0.106을 사용하여 알림을 보내는 방법은 무엇입니까?

펜 드라이브를 잊어버리지 않도록 애플리케이션을 개발 중입니다.

펜 드라이브가 기기에 연결되어 있는 경우 이 애플리케이션을 잠가야 합니다. 이 형식에서는 플래시 드라이브가 연결된 동안 사용자가 시스템을 종료하려는 경우 시스템은 종료 잠금을 해제하려면 플래시 드라이브를 분리해야 함을 알리는 알림을 표시합니다.

종료 이벤트를 감지하기 위해 시스템에 연결된 펜 드라이브가 있는지 확인하는 스크립트를 호출하는 polkit 규칙을 설정했습니다.

펜 드라이브가 연결된 경우 send_notify.sh다음 명령을 실행하는 스크립트 호출을 통해 polkit 규칙에 알림이 전달됩니다.

notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000

폴킷 규칙은 다음과 같습니다.

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;
     }
   }
  }

하지만. 이 폴킷 규칙을 설정하고 닫기 버튼을 누른 후에는 사용자에게 알림이 전송되지 않습니다.

규칙을 디버깅하고 실행된 두 번째 스크립트를 확인했지만 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루트로 알림을 보내는 것은 허용되지 않습니다.

나중에 사용자를 변경하기 위해 해결 방법을 수정하여 테스트하겠습니다.

업데이트 2: 코드가 이것으로 변경되었습니다. 문제는 여전히 존재합니다.

#!/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'

답변1

polkit (및 pkexec)은 X 액세스 및 에 필요한 환경 변수를 제거합니다 DISPLAY. 디스플레이에 액세스할 수 없기 때문에 실패합니다.XAUTHORITYnotify-send

~에서pkexec 맨페이지:

따라서 $DISPLAY 및 $XAUTHORITY 환경 변수가 설정되지 않았기 때문에 pkexec에서는 다른 사용자로 X11 응용 프로그램을 실행할 수 없습니다. 작업의 org.freedesktop.policykit.exec.allow_gui 주석이 null이 아닌 값으로 설정된 경우 이 두 변수는 유지됩니다.

나는 polkit에 익숙하지 않습니다. 아마도 org.freedesktop.policykit.exec.allow_gui이 규칙을 설정할 수도 있고 다른 가능성이 있을 수도 있습니다. 죄송합니다. 기성 솔루션을 제공할 수 없습니다.

그러나 핵심은 DISPLAYXAUTHORITY를 제공하는 것입니다 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)

답변2

@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

그런데 종료 버튼을 누른 후 종료 메뉴가 나타나는 데 시간이 오래 걸리고 알림도 나타나지 않았습니다.

답변3

마지막으로 사용자로 시작하여 시스템 버스에서 신호를 수신하고 사용자에게 알림을 표시하는 dbus 클라이언트를 만들었습니다.

dbus 클라이언트 코드는 다음 위치에 있습니다.https://github.com/AlmuHS/Pendrive_Reminder/blob/work-in-progress/dbus-client/client.py

send-notify.sh방금 추가한 스크립트 에서

 dbus-send --system /org/preminder/mensaje org.preminder.App

dbus 클라이언트를 사용자로 실행하면 알림이 올바르게 표시됩니다.

이제 사용자가 펜 드라이브를 연결할 때 클라이언트가 자동으로 시작될 수 있도록 노력합니다.

계속해서 입력하세요스크립트에서 dbus 클라이언트를 시작하는 방법은 무엇입니까?

관련 정보