xfce Debian에서 xscreensaver가 활성화되면 일시 중지 버튼이 작동하지 않습니다.

xfce Debian에서 xscreensaver가 활성화되면 일시 중지 버튼이 작동하지 않습니다.

나는 데비안 jessie와 xfce를 가지고 있습니다. 전원 버튼을 누르면 시스템이 일시 중지됩니다. 키보드의 아무 키나 누르면 시스템이 깨어나고 Xscreensaver에서 로그인 프롬프트를 받습니다(화면 잠금이 활성화됨). 이제 전원 버튼을 눌러도 시스템이 일시 중지되지 않으므로 로그인해야 전원 버튼을 사용하여 시스템을 일시 중지할 수 있습니다. Xscreensaver 로그인 화면에서 시스템을 일시 중지하는 방법이 있습니까?

답변1

문제는 (아마도) xfce 세션의 일부 프로그램, 즉 시스템 트레이의 일부 전원 관리자 프로그램이 보류 중인 버튼 누르기 이벤트를 처리하고 있다는 것입니다. 화면이 잠겨 있는 경우,모두화면 보호기는 일시 중지 버튼을 포함한 키 누르기를 차단합니다.

수리하다가능한버튼 처리가 구성되어 /etc/systemd/logind.conf있는지 확인하세요 systemd. 그렇다면 HandleSuspendKey=suspend일시 systemd정지 버튼을 누르면 일시 정지가 시작됩니다. 하지만 화면이 잠금 해제되면 어떻게 될지 모르겠습니다! 일시 정지 버튼 누르기를 무시하도록 전원 관리자 프로그램에 지시해야 할 수도 있습니다. 완전한 답변을 드리기는 어렵지만, 이 답변이 최소한 올바른 방향으로 나아가는 데 도움이 되기를 바랍니다.

답변2

Xscreensaver가 제대로 실행되고 있습니다. 내가 이해한 바로는 XGrabKeyboardXscreensaver는 로그인 창을 표시할 때 키 입력을 잡기 위해 이를 사용합니다. 간단히 말해서, 일반적으로 잠금 화면에서는 전원 버튼을 사용할 수 없지만, 그 이유와 어떤 솔루션이 존재할 수 있는지 알아보기 위해 많은 문서와 일부 코드를 살펴보았습니다.

Xscreensaver 잠금을 우회하는 데는 몇 가지 예외가 있으며, 모두 낮은 수준의 키보드 단축키를 사용해야 합니다.1.

백도어 #1: Ctrl-Alt-백스페이스. 이 키 입력은 X 서버를 종료하고 일부 시스템에서는 텍스트 콘솔이 남습니다. 사용자가 X11을 수동으로 시작하면 텍스트 콘솔은 계속 로그인됩니다. 이 키 입력을 전체적으로 영구적으로 비활성화하려면 xorg.conf, XF86Config 또는 XF86Config-4 파일(시스템에서 사용되는 이름)에서 DontZap 플래그를 설정해야 합니다. 자세한 내용은 XF86Config(또는 변형) 설명서를 참조하세요.

백도어 #2: Ctrl-Alt-F1, Ctrl-Alt-F2 등 이러한 키 입력은 다른 가상 콘솔로 전환하여 X11을 실행하는 콘솔을 잠급니다. 쉘을 다른 가상 콘솔에 로그인하면 쉘이 보호되지 않습니다. 따라서 다른 콘솔에 로그인된 상태로 두지 마십시오. xorg.conf에서 DontVTSwitch를 설정하여 VT 전환을 전체적으로 영구적으로 비활성화할 수 있지만 이렇게 하면 시스템을 사용하기가 더 어려워질 수 있습니다.

백도어 #3: Alt-SysRq-F. 이것은 Linux 커널의 "OOM-killer" 버튼입니다. 선택한 장기 실행 프로그램을 무작위로 종료하므로 xscreensaver를 표적으로 삼아 죽일 수 있습니다. xscreensaver는 이로부터 자신을 보호할 수 없습니다. 다음을 사용하여 전역적으로 비활성화할 수 있습니다: sudo 'echo 176 > /proc/sys/kernel/sysrq'

백도어 #4: Ctrl-Alt-KP_Multiply. 이 키는 잠금 장치가 있는 모든 X11 응용 프로그램을 종료하므로 이 키를 입력하면 xscreensaver가 종료되고 화면 잠금이 해제됩니다. 이 "기능"은 2008년 X 서버에 등장했으며 2011년 현재 일부 공급업체에서는 이 기능을 기본으로 설정합니다. 정말 좋네요. xorg.conf에서 AllowClosedownGrabs를 꺼서 비활성화할 수 있습니다.

실제로 AllowClosedownGrabs잠금을 유지하는 Xscreensaver 프로세스를 종료하거나 AllowDeactivateGrabs키보드 스크래핑을 비활성화 및 활성화하도록 Xorg를 구성할 수 있습니다.2. 물론 이로 인해 키보드에 물리적으로 접근할 수 있는 사람에게는 잠금 장치가 쓸모 없게 되지만, 최소한 AllowClosedownGrabs 또는 AllowDeactivateGrabs 단축키를 사용한 후 컴퓨터가 정지되는지 확인하기 위해 전원 버튼을 테스트할 수 있어야 합니다.

이 시점에서 머신을 성공적으로 일시 중지했다면 최소한 XGrabkeyboard에 의해 캡처되지 않고 서버의 동작을 제어할 수 있는 작업을 수행할 수 있는 일정 수준의 키보드 매핑이 있다는 것을 알게 됩니다.

이 단축키는 Ctrl-Alt-FX화면이 잠겨 있을 때 가상 터미널을 전환합니다 XF86_Switch_VT_X. 여기서 XF 키는 1-12입니다. 따라서 우리는 xkb에 대한 이러한 키가 도난당하지 않았다는 것을 알고 있습니다.

프로그램 출력 발췌 grep -r "XF86_Switch" /usr/share/X11/xkb/:

/usr/share/X11/xkb/compat/xfree86:    interpret  XF86_Switch_VT_1 {
/usr/share/X11/xkb/symbols/srvr_ctrl:   symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1 ]

이 파일을 살펴보면 키보드 잡기를 취소하고 활성 클라이언트를 종료하기 위한 키 조합도 포함되어 있음을 알 수 있습니다.

따라서 잠금 화면 중에 전원 버튼을 일시 중지하는 방법이 있는 경우 전원 버튼에 대한 사용자 정의 xkb 키가 필요할 수 있습니다. 또한 Ungrab현재 활성화된 모든 스내치를 취소 하는데도 사용해야 합니다 .

지금으로서는 이것이 제가 드릴 수 있는 전부입니다. 특히 Ungrab아래와 같이 전원 버튼의 xkb 키 매핑 및 사용할 키 매핑과 관련하여 몇 가지 새로운 질문이 제기될 수 있습니다 .

커밋 7d2543a3cb3089241982ce4f8984fd723d5312a1에서

Add four new private XKB actions for debugging:
    * PrGrbs: print active grabs to the log file
    * Ungrab: ungrab all currently active grabs
    * ClsGrb: kill clients with active grabs
    * PrWins: dump the current window tree to the log file

To use these, you need to modify your XKB maps, e.g. the following to
have Ctrl+Alt+(F9-F12) mapped to the above:
 - compat/xfree86:
    interpret XF86LogGrabInfo {
        action = Private(type=0x86, data="PrGrbs");
    };
    interpret XF86Ungrab {
        action = Private(type=0x86, data="Ungrab");
    }
    interpret XF86ClearGrab {
        action = Private(type=0x86, data="ClsGrb");
    }
    interpret XF86LogWindowTree {
        action = Private(type=0x86, data="PrWins");
    }

 - symbols/pc:
    key <FK09> {        type="CTRL+ALT", [ Return, XF86LogGrabInfo      ]   };
    key <FK10> {        type="CTRL+ALT", [ Return, XF86Ungrab           ]   };
    key <FK11> {        type="CTRL+ALT", [ Return, XF86ClearGrab        ]   };
    key <FK12> {        type="CTRL+ALT", [ Return, XF86LogWindowTree    ]   };

편집하다:ACPI의 전원 단추 이벤트는 올바르게 작동할 수 있지만 다음과 같은 이유로 처리되지 않습니다.XGrabServer4xscreensaver에서 사용하는 잠금5.

XGrabServer 기능은 요청 처리를 비활성화하고 이 요청이 도착한 연결을 제외한 다른 모든 연결을 닫습니다.

이 문제를 해결하는 유일한 방법은 옵션을 활성화 AllowClosedownGrabs하고 Ctrl+Alt+Keypad-Multiply키 조합을 사용하는 것입니다.6.

AllowDeactivateGrabs 및 AllowClosedownGrabs 옵션을 사용하면 사용자가 화면 보호기/잠금 프로그램에서 사용하는 잡기를 제거할 수 있습니다.

이 작업이 정말로 지겨워지고 싶다면 전원 버튼을 지원하는 xscreensaver용 패치를 작성해 볼 수 있습니다(아마도 ACPI 이벤트를 수신한 XUngrabServer다음 다시 이벤트를 내보내는 것). 시스템이 복구되면 다시 잡아야 합니다. 그렇지 않으면 잠금은 의미가 없습니다. 이것이 다른 보안에 어떤 영향을 미칠지 모르겠습니다.

편집 2:xfce4-power-manager-settings전원 버튼을 누르면 꺼지도록 설정하여 테스트했으며 , 화면이 잠겨도 작동합니다. 이는 ACPI 처리에는 전원 버튼의 스캔 코드만 필요하고 창 관리자 수준에서는 처리할 필요가 없기 때문이라고 생각합니다.

전원 버튼을 설정하는 테스트는 Suspendxscreensaver에 의해 포착되어 차단됩니다.

나는 다음을 읽었습니다7pm-suspend, xscreensaver가 실행되는 동안 직접적으로 방해받지 않는지 확인하기 위해 테스트하기로 결정했습니다 .

xfce4-power-manager는 pkexec를 사용하여 pm-suspension을 호출합니다. pkexec를 사용하면 다른 사용자(이 경우 루트)로 프로그램을 실행할 수 있습니다.

먼저 sudo ls비밀번호를 입력하고 사용자에게 임시 sudo 권한을 부여했습니다.

다음으로 다음 명령을 실행합니다.

sleep 60 && xscreensaver-command -lock &
sleep 60 && sudo pm-suspend

화면이 잠긴 다음 시스템이 예상대로 일시 중지되었습니다.

나는 정지가 창 관리자 수준에서 처리되고 xfce4-power-managerxkb 키맵을 사용하여 창 관리자 수준에서 처리할 수 있는 키코드로 변환된 스캔코드를 처리한다고 생각합니다. 이는 크롤링되어 실행이 차단된 이유를 설명합니다.pm-suspend8.

udev 키맵이 정확합니다. 앞서 말했듯이 커널 수준에는 KEY_SLEEP(RAM 일시 중지)과 KEY_SUSPEND(디스크 일시 중지, 최대 절전 모드라고도 함)만 있습니다.

X.org 수준에서 /usr/share/X11/xkb/keycodes/evdev에는 KEY_SLEEP 및 KEY_SUSPEND가 할당됩니다. 그런 다음 /usr/share/X11/xkb/symbols/inet가 XF86Sleep 및 XF86Suspend에 매핑되고 이미지 이름이 evdev로 지정됩니다.

올바르게 읽으면 내 시스템에서도 이와 유사합니다.

grep -r "Suspend" /usr/share/X11/xkb/

산출:

/usr/share/X11/xkb/geometry/everex:    indicator "Suspend"  { left=112; };
/usr/share/X11/xkb/keycodes/evdev:  indicator 7  = "Suspend";
/usr/share/X11/xkb/symbols/inet:    key <I213>   {      [ XF86Suspend           ]       };
/usr/share/X11/xkb/server-0.xkb:    indicator 7 = "Suspend";
/usr/share/X11/xkb/server-0.xkb:    key <I213> {         [     XF86Suspend ] };

편집 3:xfce4-power-manager이 경우 ACPI를 사용하는 대신 직접 정지하도록 구성해 보십시오.

/etc/acpi/events/powerbtn이를 올바르게 처리 하려면 호출할 셸 스크립트를 작성해야 할 수도 있습니다 . 바라보다Linux에서 노트북을 일시 중지하고 최대 절전 모드로 전환하는 방법

xscreensaver-command -lock시스템이 다시 시작될 때 화면이 잠겨 있는지 확인하려면 일시 중단하기 전에 스크립트에서 이를 사용해야 할 수도 있습니다. Xscreensaver는 화면이 잠겨 있는지 확인하고 xscreensaver-command: already locked.잠긴 경우 출력합니다.

답변3

여전히 관심이 있는 사람이 있다면 며칠 전 보류 중인 키를 처리하기 위해 시스템 인프라를 사용하지 않은 랩톱에서 비슷한 문제가 발생했습니다(긴 이야기이고 여기서는 그다지 관련이 없습니다). 어쨌든 내 해결책은 시스템 전체 반응에 acpid를 사용하는 것이었습니다.

1) 내 창 관리자(openbox)는 OSD 메시지를 표시하고 xscreensaver-command lock을 실행하여 일시 중지 키(XF86Sleep)에 반응합니다.

2) acpid는 일시 중지 키(event=button/sleep SBTN)에 반응하고 2초 동안 휴면 상태를 유지한 다음 uswsusp에서 s2ram을 실행합니다(예:https://wiki.debian.org/Uswsusp)

관련 정보