Отключить ввод с клавиатуры и мыши в Unix (под X)

28

Как можно программно «временно заморозить» клавиатуру и мышь, чтобы никто не мог связываться с системой?

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

человек, любящий учиться
источник
4
Связанный: подобный вопрос на OSX
Жиль "ТАК - перестань быть злым"

Ответы:

24

Предполагая, что ваш графический интерфейс основан на X (как почти все графические интерфейсы UNIX), используйте xinput.

Сначала перечислите ваши устройства:

$ xinput --list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Windows mouse                             id=6    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Windows keyboard                          id=7    [slave  keyboard (3)]

Перечислите детали для вашей мыши (id = 6 в нашем примере):

$ xinput --list-props 6
Device 'Windows mouse':
    Device Enabled (112):   1
    Coordinate Transformation Matrix (114): 1.000000, 0.000000, 0.000000, 0.000000,   1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (222):     0
    Device Accel Constant Deceleration (223):       1.000000
    Device Accel Adaptive Deceleration (224):       1.000000
    Device Accel Velocity Scaling (225):    10.000000

Теперь отключите это:

$ export DISPLAY=:0
$ xinput set-int-prop 6 "Device Enabled" 8 0

Чтобы включить это, сделайте:

$ xinput set-int-prop 6 "Device Enabled" 8 1

То же самое касается клавиатуры, просто замените номер int-prop на правильный id.
Проверено и работает на Cygwin.

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

человек, любящий учиться
источник
Никакой другой ответ здесь не отвечает на вопрос.
Филомат
В моем случае команда отключения мыши выглядит следующим образом: xinput set-int-prop 9 "Device Enabled" 8 0- только: 1) я бы тоже хотел скрыть указатель мыши и 2) если я перейду с X на tty (консоль Linux / VT), и затем возвращается к X, это сбрасывается ( xinput list-props 9подтверждает это).
Эмануэль Берг
Могу ли я отключить устройство «главный указатель»?
ed22
14

xinput --set-int-propне рекомендуется. Вы должны использовать --set-propвместо этого. Также xinput --enable [device]и xinput --disable [device]может использоваться для включения и отключения устройств соответственно.

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

#!/bin/bash
# Enables, disables, or toggles device

device='AlpsPS/2 ALPS GlidePoint'
if [[ $1 == -e ]] ; then
    # Enable
    #xinput --set-prop "$device" "Device Enabled" 1
    xinput --enable "$device"
elif [[ $1 == -d ]] ; then
    # Disable
    #xinput --set-prop "$device" "Device Enabled" 0
    xinput --disable "$device"
elif [[ $1 == -t ]] ; then
    # Toggle
    if [[ $(xinput list-props "$device" |
       grep "Device Enabled") == *:*1 ]] ; then
           #xinput --set-prop "$device" "Device Enabled" 0
           xinput --disable "$device"
    else
        #xinput --set-prop "$device" "Device Enabled" 1
        xinput --enable "$device"
    fi
else
    echo "usage: $0 [-edt]"
fi

источник
Проверьте мой комментарий к сообщению Филомата. У меня та же проблема для xinput --disable 9.
Эмануэль Берг
6

Ответ на вопрос с использованием xinput является правильным, но вот быстрый, если все, что вам нужно, это простая блокировка типа заставки. Я написал это еще в 90-х годах, и все, что он делает, это использует события клавиатуры и мыши X-сервера, пока вы не введете пароль. Нет обратной связи вообще, кроме выхода, когда вы вводите его правильно.

http://ishiboo.com/~danny/Projects/xl/

Я использую его как блокировку экрана, именно так, как вы хотите его использовать.

Дэнни Дулай
источник
Я проголосовал за это, так как это решение, которое я хочу, но оно не работает для меня в Linux с теневыми паролями. Процесс должен иметь права root для доступа к / etc / shadow и связанным с ним функциям, но я хочу запустить xl от имени пользователя без полномочий root. Мой вариант использования: когда мы смотрим шоу на компьютере, моя маленькая дочка любит играть на клавиатуре! xscreensaver не полезен для этого
Сэм Уоткинс
Ваш ответ является отличным примером того, как «бессмысленное» или unix-программирование «делай одно и делай это хорошо» ... за исключением того, что оно не работает для меня (с теневыми паролями!) Для моего случая использования я рад усердно -кодировать пароль, так что все в порядке. Теперь научите меня, как отключить кнопку питания, это любимая кнопка моего ребенка!
Сэм Уоткинс
почему ты не хочешь рут? почему не suid бинарный xl?
Дэнни Дулай
Кстати, вы можете указать пароль в командной строке или через переменную окружения сейчас.
Дэнни Дулай
Можно ли съесть события ввода X стандартным набором инструментов X и сценарием оболочки?
Александр Щебликин
2

Ваш ответ, вероятно, лучше всего подходит для вашего второго варианта использования (что-то делать удаленно), но, вероятно, не для вашего первого (если вы находитесь вдали от клавиатуры). Как бы вы снова запустили xinput для восстановления доступа после возвращения?

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

CJM
источник
Я обновил.
Филомат
2

По крайней мере, в системах на основе Debian, таких как Ubuntu, есть утилита, xtrlock (1)доступная через репозитории пакетов.

Эта утилита блокирует клавиатуру и мышь до тех пор, пока пароль не будет введен, оставляя видимыми окна. Я считаю это полезным для компьютеров, на которых работают информационные дисплеи и тому подобное.

Юкка Мателайнен
источник
Это кажется самым простым и легким вариантом, и он был примерно с середины 90-х годов. Одна проблема - я не думаю, что возможно скрыть заблокированное изображение курсора, что, к сожалению, делает его непригодным для обозначения.
aexl
1

В зависимости от вашего оборудования вы можете удалять модули, контролируя ваше оборудование. У меня есть такой скрипт, touchpadtoggleчтобы включить и отключить сенсорную панель.

lsmod | grep -q psmouse && rmmod psmouse || modprobe psmouse

Но с клавиатурой, похоже, не связан модуль, а модуль psmouse будет работать только изредка.

неизвестный пользователь
источник
1

Если вы используете среду рабочего стола или менеджер входа в систему (GNOME, KDE, XFCE, LXDE), почти все из них имеют функцию блокировки экрана, где вам нужно ввести пароль, чтобы вернуться к своим программам.

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

loosecannon
источник
Я обновил.
Филомат
1

Я написал это (в .zshrc, но должен работать в .bashrc), чтобы сделать это, с помощью ответов выше. Чтобы сделать соответствующее с клавиатуры, измените параметр в grep Mouse.

setmouse () {
 xinput \
  $1 \
  `xinput | grep Mouse | tr -d " " | tr "\t" " " | cut -d" " -f2 | cut -d"=" -f2`
}
offmouse () { setmouse disable }
onmouse  () { setmouse enable  }
Эмануэль Берг
источник
Проверьте мой ответ на аналогичный вопрос о SO - он делает то же самое, но может быть вызван из tty, и, кроме того, он (используя обходной путь) скрывает указатель.
Эммануил Берг