펜 드라이브를 잊어버리지 않도록 애플리케이션을 개발 중입니다.
펜 드라이브가 기기에 연결되어 있는 경우 이 애플리케이션을 잠가야 합니다. 이 형식에서는 플래시 드라이브가 연결된 동안 사용자가 시스템을 종료하려는 경우 시스템은 종료 잠금을 해제하려면 플래시 드라이브를 분리해야 함을 알리는 알림을 표시합니다.
종료 이벤트를 감지하기 위해 시스템에 연결된 펜 드라이브가 있는지 확인하는 스크립트를 호출하는 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
. 디스플레이에 액세스할 수 없기 때문에 실패합니다.XAUTHORITY
notify-send
~에서pkexec 맨페이지:
따라서 $DISPLAY 및 $XAUTHORITY 환경 변수가 설정되지 않았기 때문에 pkexec에서는 다른 사용자로 X11 응용 프로그램을 실행할 수 없습니다. 작업의 org.freedesktop.policykit.exec.allow_gui 주석이 null이 아닌 값으로 설정된 경우 이 두 변수는 유지됩니다.
나는 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)
답변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 클라이언트를 시작하는 방법은 무엇입니까?