Кнопка Suspend не работает, когда xscreensaver активен на xfce Debian

У меня есть Debian jessie и xfce. Когда я нажимаю кнопку питания, моя система приостанавливается. Когда я нажимаю любую клавишу на моей клавиатуре, система просыпается, и я получаю приглашение на вход Xscreensaver (блокировка экрана активна). Теперь, если я нажимаю кнопку питания, система не приостанавливается, я должен войти в систему, а затем я могу приостановить систему с помощью кнопки питания. Есть ли способ приостановить систему на экране входа в систему Xscreensaver?

  • Смешение пулов на монетном дворе
  • Как вручную запустить приложение XScreenSaver в корневом окне (полный экран)?
  • Как правильно заблокировать рабочий стол при спящем режиме?
  • Как использовать экран блокировки рабочего стола и отключить экран входа в систему XScreenSaver?
  • Как установить xscreensaver для использования пустого режима без GUI?
  • Как я могу активировать / настроить заставку в Wayland / GNOME?
  • запустить xscreensaver с cron @ reboot, запуск ubuntu, сервис / deamon?
  • Xscreen saver не блокирует пользователя
  • 2 Solutions collect form web for “Кнопка Suspend не работает, когда xscreensaver активен на xfce Debian”

    Xscreensaver работает нормально. Из того, что я понимаю, XGrabKeyboard используется Xscreensaver, который захватывает ключи, пока отображается окно входа в систему. Короткий ответ заключается в том, что вы обычно не можете использовать кнопку питания на заблокированном экране, но я просмотрел много документации и некоторый код, чтобы понять, почему это так и какие возможные решения могут существовать.

    Есть только несколько исключений для обхода блокировки Xscreensaver, все из которых основаны на использовании сочетаний клавиш более низкого уровня 1 .

    Backdoor # 1: Ctrl-Alt-Backspace. Это нажатие клавиши на X-сервере, а на некоторых системах – на текстовой консоли. Если пользователь запустил X11 вручную, эта текстовая консоль все равно будет зарегистрирована. Чтобы отключить это нажатие клавиши глобально и постоянно, вам необходимо установить флаг DontZap в файл xorg.conf или XF86Config или XF86Config-4 (какое бы имя оно не использовало на вашей системы). Подробнее см. Руководство для XF86Config (или вариант).

    Backdoor # 2: Ctrl-Alt-F1, Ctrl-Alt-F2 и т. Д. Эти нажатия клавиш переключаются на другую виртуальную консоль, оставляя консоль X11 запущенной на заблокированной. Если вы оставили оболочку, зарегистрированную на другой виртуальной консоли, она не защищена. Поэтому не оставляйте себя вошедшим в систему на других консолях. Вы можете отключить переключение VT глобально и постоянно, установив DontVTSwitch в xorg.conf, но это может сделать вашу систему более сложной в использовании.

    Backdoor # 3: Alt-SysRq-F. Это ядро ​​Linux «OOM-killer» нажатие клавиши. Он снимает случайные длительные программы по своему выбору, и поэтому может быть нацелен и убит xscreensaver, и нет никакой возможности для xscreensaver защитить себя от этого. Вы можете отключить его глобально с помощью: sudo 'echo 176> / proc / sys / kernel / sysrq'

    Backdoor # 4: Ctrl-Alt-KP_Multiply. Это нажатие клавиши уничтожает любое приложение X11, которое удерживает блокировку, поэтому набрав это, вы убьете xscreensaver и разблокируете экран. Эта «функция» появилась на X-сервере в 2008 году, и с 2011 года некоторые поставщики отправляют ее по умолчанию. Как мило. Вы можете отключить его, отключив AllowClosedownGrabs в xorg.conf.

    Так как вы можете настроить Xorg на AllowClosedownGrabs чтобы закрыть процесс Xscreensaver, удерживая блокировку, или AllowDeactivateGrabs для деактивации и активных захватов клавиатуры 2 . Это, конечно же, делает бесполезным блокировку для любого пользователя с физическим доступом к вашей клавиатуре, но вы должны, по крайней мере, проверить свою кнопку питания, чтобы проверить, приостановит ли она устройство после использования ярлыка AllowClosedownGrabs или AllowDeactivateGrabs.

    Если вам удастся приостановить работу машины в данный момент, то, по крайней мере, мы знаем, что существует определенный уровень сопоставления клавиш с действиями, которые управляют поведением сервера, не попадая на XGrabkeyboard.

    XF86_Switch_VT_X клавиш Ctrl-Alt-FX переключит виртуальный терминал через XF86_Switch_VT_X , где X – номер клавиши F 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 для уничтожения всех активных в настоящее время захватов.

    Это примерно так, как я могу вас принять сейчас. Это может потребовать пару новых вопросов, конкретно касающихся сопоставления клавиш xkb кнопки питания, а также отображения ключа для использования Ungrab как показано ниже.

    От фиксации 7d2543a3cb3089241982ce4f8984fd723d5312a1 3

     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, eg 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 может нормально функционировать, но оно не обрабатывается из-за блокировки XGrabServer 4, используемой xscreensaver 5 .

    Функция XGrabServer отключает обработку запросов и закрытие всех других подключений, чем тот, к которому пришел этот запрос.

    Единственный способ, которым я знаю об этом, – включить опции AllowClosedownGrabs и использовать Ctrl+Alt+Keypad-Multiply 6 .

    Обратите внимание, что опции AllowDeactivateGrabs и AllowClosedownGrabs позволят пользователям удалить захват, используемый программами экранной заставки / шкафчика.

    Если вы действительно захотите на нее наброситься, вы можете попытаться написать патч для xscreensaver для поддержки кнопки питания (возможно, прослушивание ACPI-события, XUngrabServer , повторное событие). При повторном запуске системы он должен будет снова захватить, иначе блокировка будет бессмысленной. Я не знаю, какие другие последствия для безопасности у него были бы.

    Редактирование 2: Тестирование с xfce4-power-manager-settings установленными на выключение при нажатии кнопки питания, работает, пока экран заблокирован. Я считаю, что это связано с тем, что для обработки с помощью ACPI требуется только scancode для кнопки питания, и обработка на уровне диспетчера окон необязательна.

    Тестирование с помощью кнопки питания, установленной на Suspend , захватывается xscreensaver и предотвращается.

    Я прочитал следующие 7 и решил протестировать pm-suspend пока xscreensaver работал, чтобы убедиться, что ему не мешают напрямую.

    xfce4-power-manager, который использует pkexec для вызова pm-suspend. pkexec позволяет выполнять программу в качестве другого пользователя, в данном случае – root.

    Сначала я запустил sudo ls чтобы ввести пароль и предоставить пользователю временные привилегии sudo.

    Затем я выполнил следующие команды:

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

    Экран был заблокирован, а затем система была приостановлена, как ожидалось.

    Я считаю, что suspend обрабатывается на уровне оконного менеджера, а xfce4-power-manager полагается на сопоставление ключей xkb, чтобы обрабатывать его после scancode в код ключа, который можно обрабатывать на уровне оконного менеджера. Это объясняет, почему оно подлежит захвату и не позволяет выполнить pm-suspend 8 .

    Клавиатуры udev верны. Как я уже сказал, на уровне ядра есть только KEY_SLEEP (приостановка в ОЗУ) и 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: попробуйте настроить ACPI для приостановки непосредственно, вместо использования xfce4-power-manager , если это так.

    Возможно, вам понадобится написать сценарий оболочки, который будет вызываться из /etc/acpi/events/powerbtn чтобы справиться с этим правильно. См. Раздел Как приостановить и спящий ноутбук под Linux

    Вероятно, вам придется использовать xscreensaver-command -lock в своем скрипте перед приостановкой, если вы хотите убедиться, что экран заблокирован при восстановлении системы. Xscreensaver проверяет, заблокирован ли экран и выводит xscreensaver-command: already locked. если это.

    Проблема (вероятно) в том, что какая-то программа в вашем сеансе xfce обрабатывает события нажатия кнопки приостановки, т. Е. Какая-то программа управления питанием в вашем системном блоке. Если экран заблокирован, все нажатия клавиш перехватываются заставкой, включая кнопку приостановки.

    Исправить может быть проверка вашего /etc/systemd/logind.conf , здесь настройка systemd кнопки настроена. Если у него есть HandleSuspendKey=suspend , systemd инициирует приостановку, если нажата кнопка suspend. Однако я не уверен, какой эффект будет, если ваш экран будет разблокирован! Возможно, вам нужно будет сообщить программе управления электроприводом игнорировать нажатия кнопок приостановки. Трудно дать полный ответ, но я надеюсь, что этот ответ по крайней мере даст вам толчок в правильном направлении.

    Interesting Posts

    Debian Squeeze: скрыть сообщения об отправке xorg

    Изменение имени файла с нижнего регистра на верхний регистр рекурсивно

    Могу ли я сделать низкоуровневые изменения на корневом fs, установленном RO?

    Отображать цвета в сценарии оболочки

    Действительно ли `dd` действительно необходимо клонировать диск?

    Опрос на сервере SFTP (лучший способ скопировать новые файлы с сервера SFTP на локальный компьютер через регулярные промежутки времени)

    Когда моя машина последний раз коснулась?

    Почему я не могу найти аппаратное кеш-событие в моем перфомансе?

    Выполните поиск регулярных выражений по ранее определенной линии с регулярным выражением (однострочный)

    Мониторинг истории USB-накопителей

    Переменная замена в сценарий sed

    Как установка CentOS работает изнутри?

    Как извлечь определенные файлы из tar.gz

    Разрешения UMASK для новых каталогов

    proftpd не изменяет группу по умолчанию для новых файлов

    Linux и Unix - лучшая ОС в мире.