Приостановите кнопку, не работает, когда xscreensaver активен на xfce Debian

[1133262] Вы можете прочитать краткое описание многих команд, используя [1133613]whatis[1133614]:

И вы можете попросить несколько команд:

lsof | grep ":8888"

Таким образом, вы можете попробовать сгенерировать список описаний всех команд, комбинируя [1133615]whatis[1133616] с [1133617]compgen[1133618]:

alias lsof='sudo lsof -Pni4 | grep LISTEN'
2
26.01.2015, 02:23
3 ответа

Рекомендуется временно блокировать счета в EL7 с помощью pam _ faillock .

Чтобы заблокировать любого пользователя, не являющегося пользователем root, после трех неудачных попыток и разблокировать этого пользователя через 10 минут, добавьте следующие строки в раздел auth файлов/etc/pam.d/system-auth и/etc/pam.d/password-auth:

  требуется auth pam_faillock.so preauth silent audit deny = 3 unlock_time=600
auth достаточен pam_unix.so nullok try_first_pass
auth [default = die] pam_faillock.so отказ в аудите authfail = 3 unlock_time=600

Добавьте следующую строку в раздел учетных записей обоих файлов, указанных на предыдущем шаге: требуется учетная запись

  pam_faillock.so

Для проверки или сброса количества ошибок пользователя используется команда faillock .

Для получения дополнительной информации см. Руководство по безопасности Red Hat: 4,1,3. Блокировка учетных записей пользователей после неудачных попыток входа в систему

-121--175129-

Я бы хотел найти обычный образец для включения в сценарий оболочки, чтобы что n переменных будет содержать n аргументов

Далее создается массив оболочки arglist , содержащий каждый из аргументов:

$ readarray -t arglist < <(echo "\command{arg1,
    arg2 ,
    arg3
    }" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

С помощью оператора declare можно увидеть, что он работал:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'

Вот еще один пример с аргументами в одной строке:

$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}"  | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

Опять же, он работает:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'

Обратите внимание, что космос в < ( Мы перенаправляем входные данные из подстановки процесса. Без пространства bash попробует что-то другое целиком.

Принцип работы

Команда sed немного тонка. Давайте посмотрим на это кусок за раз:

  • -n

    Не печатайте строки, если явно не спрашивается.

  • /\command/{...}

    При обнаружении строки, содержащей \command , выполните следующие команды в фигурных скобках:

  • : a ;/}/! {N; b; b}

    При этом строки считываются в буфер образца до тех пор, пока не будет найдена строка, содержащая } . Таким образом, мы получаем всю команду сразу.

  • s/\\command {//

    Удалите \command { последовательности.

  • s/[\n} ]//g

    Удаление всех мест, закрывающих фигурных скобок и новых строк.

  • s/,/\n/g

    Замените запятые новыми строками. Когда это делается, каждый аргумент находится в отдельной строке, которая является тем, что readarray хочет.

  • p

    Печать.

-121--70738-

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

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

0
27.01.2020, 22:21

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тестирование с кнопкой питания, установленной на Приостановить , захватывается 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

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

Я считаю, что приостановка обрабатывается на уровне оконного менеджера, а xfce4-power-manager полагается на отображение клавиш xkb, чтобы обработать его после скан-кода в ключевой код, который может быть обработан в окне уровень менеджера. Это могло бы объяснить, почему он может быть захвачен и не может выполнить 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 ] };

Edit 3: Попробуйте настройка ACPI на приостановку напрямую вместо использования xfce4-power-manager , если это так.

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

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

1
27.01.2020, 22:21

Если кому-то еще интересно, несколько дней назад я столкнулся с похожей проблемой на своем ноутбуке, где я не использую инфраструктуру systemd для обработки ключа приостановки (, это длинная история, не очень уместная здесь ). В любом случае, мое решение состоит в том, чтобы использовать acpid для проведения системной -широкой реакции :

.

1 )мой оконный менеджер (openbox )реагирует на клавишу приостановки -(XF86Sleep ), отображая сообщение OSD и выполняя xscreensaver -блокировку команды

2 )acpid реагирует на кнопку приостановки -(event=button/sleep SBTN )засыпанием на 2 секунды и последующим выполнением s2ram из uswsusp (см., например,https://wiki.debian.org/Uswsusp)

0
11.05.2020, 15:26

Теги

Похожие вопросы