Desactivar entrada de teclado y mouse en unix (bajo X)

28

¿Cómo se puede "congelar" mediante programación el teclado y el mouse temporalmente, para que nadie pueda meterse con el sistema?

Hay varias posibilidades donde esto es útil. Por ejemplo, tengo una computadora portátil y quiero asegurarme de que nadie la use mientras me voy, incluso si alguien conoce la contraseña o puede adivinarla (como esposa o hijos), así como deprimir el apetito de los ladrones (como parece -marcha). o estoy haciendo algo de forma remota, así que quiero asegurarme de que el usuario de la computadora no moleste.

Philomath
fuente
44
Relacionado: pregunta similar sobre OSX
Gilles 'SO- deja de ser malvado'

Respuestas:

24

Suponiendo que su GUI está basada en X (como casi todas las GUI de UNIX), use xinput.

Primero, enumere sus dispositivos:

$ 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)]

Enumere los detalles de su mouse (id = 6 en nuestro ejemplo):

$ 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

Ahora deshabilítelo:

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

Para habilitarlo haz:

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

Lo mismo ocurre con el teclado, solo reemplace el número int-prop con la identificación adecuada.
Probado y trabajado en cygwin.

Por supuesto, debe planificar de antemano cómo volverá a habilitar sus dispositivos. como programarlo en cron, volver a habilitarlo de forma remota o deshabilitar solo uno de ellos en primer lugar.

Philomath
fuente
Ninguna otra respuesta aquí responde a la pregunta.
Philomath
En mi caso, el comando para deshabilitar el mouse se ve así: xinput set-int-prop 9 "Device Enabled" 8 0- solo, 1) Me gustaría ocultar el puntero del mouse también, y 2) si voy de X a tty (consola Linux / VTs), y luego de vuelta a X, esto se restablece ( xinput list-props 9confirma esto).
Emanuel Berg
¿Puedo desactivar un dispositivo "puntero maestro"?
ed22
14

xinput --set-int-propes obsoleto. Deberías usar --set-propen su lugar. Además, xinput --enable [device]y xinput --disable [device]se puede usar para habilitar y deshabilitar dispositivos respectivamente.

Aquí hay un script de shell que uso para habilitar, deshabilitar y alternar el panel táctil de mi computadora portátil:

#!/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

fuente
Mira mi comentario en la publicación de Philomath. Tengo el mismo problema para xinput --disable 9.
Emanuel Berg
6

La pregunta respondida usando xinput es la correcta, pero aquí hay una rápida si todo lo que está buscando es un simple bloqueo de tipo de protector de pantalla. Escribí esto en los años 90, y todo lo que hace es comer los eventos de teclado y mouse del servidor X, hasta que escriba la contraseña. No hay comentarios en absoluto más que salir cuando lo escribe correctamente.

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

Lo uso como un bloqueo de pantalla, exactamente como quieres usarlo.

Danny Dulai
fuente
He votado a favor, ya que es el tipo de solución que quiero, pero no me funciona en Linux con contraseñas ocultas. Un proceso debe ser root para acceder a / etc / shadow y funciones asociadas, pero quiero ejecutar xl como usuario no root. Mi caso de uso: cuando miramos programas en la computadora, ¡a mi hija le gusta golpear el teclado! xscreensaver no es útil para esto
Sam Watkins
Su respuesta es un gran ejemplo de programación "suckless" o unix "haga una cosa y hágalo bien" ... excepto que no funciona para mí (¡con contraseñas ocultas!) Para mi caso de uso, me complace mucho -código una contraseña, así que está bien. Ahora enséñame cómo deshabilitar el botón de encendido, ¡ese es el botón favorito de mi bebé!
Sam Watkins,
¿Por qué no quieres root? ¿por qué no suid el binario xl?
Danny Dulai
Por cierto, ahora puede especificar la contraseña en la línea de comandos o mediante una variable de entorno.
Danny Dulai
¿Es posible comer eventos de entrada X con un conjunto de herramientas X estándar y un script de shell?
Alexander Shcheblikin
2

Su respuesta es probablemente la mejor para su segundo caso de uso (hacer algo de forma remota), pero probablemente no para la primera (estar lejos del teclado). ¿Cómo volvería a ejecutar xinput para restaurar el acceso cuando regrese?

La solución estándar para bloquear el sistema mientras está lejos de él es XScreenSaver , que se instala por defecto en la mayoría de las distribuciones. Si está configurado para bloquear el teclado, le pedirá su contraseña antes de desbloquearla.

cjm
fuente
He actualizado
Philomath
2

Al menos en los sistemas basados ​​en Debian como Ubuntu, hay una utilidad llamada xtrlock (1)disponible a través de los repositorios de paquetes.

Esta utilidad bloquea el teclado y el mouse hasta que se ingresa la contraseña y deja las ventanas visibles. Me resulta útil para las computadoras que ejecutan pantallas de información y similares.

Jukka Matilainen
fuente
Esta parece ser la opción más simple y liviana, y ha existido desde mediados de los 90 también. Un problema es que no creo que sea posible ocultar la imagen del cursor bloqueado, lo que desafortunadamente es inutilizable para la señalización.
aexl
1

Dependiendo de su hardware, puede quitar los módulos, controlando su hardware. Tengo una secuencia de comandos touchpadtogglepara habilitar y deshabilitar mi panel táctil.

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

Pero el teclado no parece tener un módulo asociado, y el módulo psmouse solo funcionará ocasionalmente.

usuario desconocido
fuente
1

Si está utilizando un entorno de escritorio o un administrador de inicio de sesión (GNOME, KDE, XFCE, LXDE), casi todos tienen una función de bloqueo de pantalla en la que debe escribir su contraseña para volver a sus programas.

Sin embargo, dado que es realmente simple, siento que su problema es más complejo / diferente.

bala perdida
fuente
He actualizado
Philomath
1

Escribí esto (en .zshrc, pero debería funcionar .bashrctambién) para hacer esto, con la ayuda de las respuestas anteriores. Para hacer lo correspondiente con el teclado, cambie el parámetro en grep Mouse.

setmouse () {
 xinput \
  $1 \
  `xinput | grep Mouse | tr -d " " | tr "\t" " " | cut -d" " -f2 | cut -d"=" -f2`
}
offmouse () { setmouse disable }
onmouse  () { setmouse enable  }
Emanuel Berg
fuente
Echa un vistazo a mi respuesta a una pregunta similar sobre SO: hace lo mismo, pero se puede invocar desde un tty, y también (usando una solución alternativa) oculta el puntero.
Emanuel Berg