Disabilita input tastiera e mouse su unix (sotto X)


28

Come si può "bloccare" programmaticamente la tastiera e il mouse temporaneamente, in modo che nessuno possa interferire con il sistema?

Esistono diverse possibilità in cui ciò è utile. Ad esempio, ho un laptop e voglio assicurarmi che nessuno lo usi mentre me ne vado, anche se qualcuno conosce la password o può indovinarla (come moglie o figli), oltre a deprimere l'appetito dei ladri (come sembra dis -funzionamento). o sto facendo qualcosa da remoto, quindi voglio assicurarmi che l'utente al computer non disturbi.


Risposte:


24

Supponendo che la tua GUI sia basata su X (come quasi tutte le GUI UNIX), usa xinput.

Innanzitutto, elenca i tuoi dispositivi:

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

Elenca i dettagli per il tuo mouse (id = 6 nel nostro esempio):

$ 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

Ora disabilitalo:

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

Per abilitarlo fai:

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

Lo stesso vale per la tastiera, basta sostituire il numero int-prop con l'id corretto.
Testato e lavorato su Cygwin.

Ovviamente, devi pianificare in anticipo come abilitare nuovamente i tuoi dispositivi. come pianificarlo su cron, riattivarlo in remoto o disabilitarne solo uno al primo posto.


Nessun'altra risposta qui risponde alla domanda.
Philomath,

Nel mio caso, il comando per disabilitare il mouse è simile al seguente: xinput set-int-prop 9 "Device Enabled" 8 0- solo, 1) Vorrei nascondere anche il puntatore del mouse, e 2) se vado da X a tty (console / VT Linux), e quindi di nuovo su X, questo viene ripristinato (lo xinput list-props 9conferma).
Emanuel Berg,

Posso disabilitare un dispositivo "puntatore master"?
ed22

14

xinput --set-int-propè deprecato. Dovresti usare --set-propinvece. Inoltre, xinput --enable [device]e xinput --disable [device]può essere utilizzato per abilitare e disabilitare i dispositivi rispettivamente.

Ecco uno script di shell che utilizzo per abilitare, disabilitare e attivare il touchpad del mio laptop:

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

Guarda il mio commento al post di Philomath. Ho lo stesso problema per xinput --disable 9.
Emanuel Berg,

6

La domanda con risposta che utilizza xinput è quella giusta, ma qui è veloce se tutto ciò che stai cercando è un semplice blocco del tipo di salvaschermo. L'ho scritto negli anni '90 e tutto ciò che fa è mangiare gli eventi della tastiera e del mouse del server X, fino a quando non si digita la password. Nessun feedback se non quello di uscire quando lo digiti correttamente.

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

Lo uso come un blocco dello schermo, esattamente come lo vuoi usare.


Ho votato a favore in quanto è il tipo di soluzione che desidero, ma non funziona per me su Linux con password shadow. Un processo deve essere root per accedere a / etc / shadow e alle funzioni associate, ma voglio eseguire xl come utente non root. Il mio caso d'uso: quando guardiamo gli spettacoli sul computer, a mia figlia piccola piace battere la tastiera! xscreensaver non è utile per questo
Sam Watkins

La tua risposta è un ottimo esempio di programmazione "senza succhiare" o unix "fai una cosa e fallo bene" ... tranne per il fatto che non funziona per me (con password shadow!) Per il mio caso d'uso sono felice di duro -codifica una password, quindi va bene. Ora insegnami come disabilitare il pulsante di accensione, questo è il pulsante preferito di mio figlio!
Sam Watkins,

perché non vuoi root? perché non usare il binario xl?
Danny Dulai,

A proposito, puoi specificare la password dalla riga di comando o tramite una variabile d'ambiente ora.
Danny Dulai,

È possibile mangiare eventi di input X con un set di strumenti X standard e uno script di shell?
Alexander Shcheblikin,

2

La tua risposta è probabilmente la migliore per il tuo secondo caso d'uso (fare qualcosa in remoto), ma probabilmente non per il tuo primo (essere lontano dalla tastiera). Come eseguiresti di nuovo xinput per ripristinare l'accesso al tuo ritorno?

La soluzione standard per bloccare il sistema mentre è lontano da esso è XScreenSaver , che è installato di default nella maggior parte delle distribuzioni. Se configurato per bloccare la tastiera, verrà richiesta la password prima di sbloccarla.


Ho aggiornato.
Philomath,

2

Almeno su sistemi basati su Debian come Ubuntu c'è un'utilità chiamata xtrlock (1)disponibile attraverso i repository di pacchetti.

Questa utility blocca la tastiera e il mouse finché non viene immessa la password lasciando visibili le finestre. Lo trovo utile per i computer che eseguono display di informazioni e simili.


Questa sembra l'opzione più semplice e leggera, ed è in circolazione dalla metà degli anni '90. Un problema è che non penso che sia possibile nascondere l'immagine del cursore bloccato, il che rende questo inutilizzabile per la segnaletica, sfortunatamente.
aexl,

1

A seconda dell'hardware, è possibile rimuovere i moduli, controllando l'hardware. Ho un tale script touchpadtoggleper abilitare e disabilitare il mio touchpad.

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

Ma la tastiera non sembra avere un modulo associato e il modulo psmouse funzionerà solo occasionalmente.


1

Se si utilizza un ambiente desktop o un gestore di login, (GNOME, KDE, XFCE, LXDE) quasi tutti hanno una funzione di schermata di blocco in cui è necessario digitare la password per tornare ai programmi.

Tuttavia, poiché è molto semplice, ritengo che il tuo problema sia più complesso / diverso.


Ho aggiornato.
Philomath,

1

Ho scritto questo (in .zshrc, ma dovrei anche lavorare .bashrc) per farlo, con l'aiuto delle risposte sopra. Per fare il corrispondente con la tastiera, cambia il parametro in grep Mouse.

setmouse () {
 xinput \
  $1 \
  `xinput | grep Mouse | tr -d " " | tr "\t" " " | cut -d" " -f2 | cut -d"=" -f2`
}
offmouse () { setmouse disable }
onmouse  () { setmouse enable  }

Controlla la mia risposta a una domanda simile su SO - fa lo stesso, ma può essere invocato da un tty e, anche (usando una soluzione alternativa) nasconde il puntatore.
Emanuel Berg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.