Desativar entrada de teclado e mouse no unix (em X)

28

Como alguém pode "congelar" programaticamente o Teclado e o Mouse temporariamente, para que ninguém possa mexer com o sistema?

Existem várias possibilidades onde isso é útil. Por exemplo, eu tenho um laptop e quero garantir que ninguém o use enquanto eu for embora, mesmo que alguém saiba a senha ou possa adivinhar (como esposa ou filhos), além de diminuir o apetite dos ladrões (como parece desanimador). -funcionando). ou estou fazendo algo remotamente, para garantir que o usuário no computador não perturbe.

Philomath
fonte
4
Related: pergunta semelhante sobre OSX
Gilles 'SO- stop be evil'

Respostas:

24

Supondo que sua GUI seja baseada em X (como quase todas as GUIs do UNIX), use xinput.

Primeiro, liste seus 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)]

Liste os detalhes do seu mouse (id = 6 em nosso exemplo):

$ 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

Agora desative-o:

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

Para habilitá-lo, faça:

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

O mesmo vale para o teclado, basta substituir o número int-prop pelo id apropriado.
Testado e trabalhado em cygwin.

Obviamente, você precisa planejar com antecedência como habilitará seus dispositivos novamente. como agendá-lo no cron, reativá-lo remotamente ou desativar apenas um deles em primeiro lugar.

Philomath
fonte
Nenhuma outra resposta aqui responde à pergunta.
Philomath 28/07
No meu caso, o comando para desativar o mouse se parece com o seguinte: xinput set-int-prop 9 "Device Enabled" 8 0- apenas 1) eu também gostaria de ocultar o ponteiro do mouse e 2) se passar de X para um tty (console Linux / VTs) e Depois, de volta ao X, isso é redefinido ( xinput list-props 9confirma isso).
Emanuel Berg
Posso desativar um dispositivo "ponteiro mestre"?
ed22 21/08
14

xinput --set-int-propestá obsoleto. Você deve usar em seu --set-proplugar. Além disso, xinput --enable [device]e xinput --disable [device]pode ser usado para ativar e desativar dispositivos, respectivamente.

Aqui está um script de shell que eu uso para ativar, desativar e alternar o touchpad do meu 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

fonte
Confira meu comentário no post de Philomath. Eu tenho o mesmo problema para xinput --disable 9.
Emanuel Berg
6

A pergunta respondida usando o xinput é a correta, mas aqui está uma pergunta rápida, se tudo o que você procura é um bloqueio simples do tipo protetor de tela. Eu escrevi isso nos anos 90, e tudo o que faz é comer os eventos de teclado e mouse do servidor X, até você digitar a senha. Nenhum feedback além de sair quando você o digita corretamente.

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

Eu o uso como um bloqueio de tela, exatamente como você deseja usá-lo.

Danny Dulai
fonte
Votei a favor, pois é o tipo de solução que eu quero, mas não funciona para mim no Linux com senhas shadow. Um processo deve ser root para acessar o / etc / shadow e as funções associadas, mas eu quero executar o xl como um usuário não root. Meu caso de uso: quando assistimos a programas no computador, minha filha gosta de bater no teclado! O xscreensaver não é útil para isso #
33333 Wat
Sua resposta é um ótimo exemplo de programação "suckless" ou unix "faça uma coisa e faça bem" ... exceto que não funciona para mim (com senhas-sombra!) Para o meu caso de uso, estou feliz -codifique uma senha, então tudo bem. Agora me ensine como desativar o botão liga / desliga, esse é o botão favorito do meu bebê!
Sam Watkins
por que você não quer root? por que não suid o binário xl?
Danny Dulai
BTW, você pode especificar a senha na linha de comando ou através de uma variável de ambiente agora.
Danny Dulai
É possível comer eventos de entrada do X com um conjunto de ferramentas padrão do X e um script de shell?
Alexander Shcheblikin
2

Sua resposta provavelmente é melhor para o seu segundo caso de uso (fazendo algo remotamente), mas provavelmente não para o seu primeiro (estar longe do teclado). Como você executaria o xinput novamente para restaurar o acesso ao retornar?

A solução padrão para bloquear o sistema enquanto ele está fora é o XScreenSaver , que é instalado por padrão na maioria das distros. Se configurado para bloquear o teclado, ele solicitará sua senha antes de desbloqueá-lo.

cjm
fonte
Eu atualizei.
Philomath
2

Pelo menos em sistemas baseados no Debian, como o Ubuntu, existe um utilitário chamado xtrlock (1)disponível nos repositórios de pacotes.

Este utilitário bloqueia o teclado e o mouse até que a senha seja digitada, deixando as janelas visíveis. Acho útil para computadores executando telas de informações e similares.

Jukka Matilainen
fonte
Essa parece ser a opção mais simples e leve, e existe desde meados dos anos 90 também. Um problema é que acho que não é possível ocultar a imagem do cursor bloqueado, o que torna isso inutilizável para sinalização, infelizmente.
aexl
1

Dependendo do seu hardware, você pode remover os módulos, controlando seu hardware. Eu tenho esse script,, touchpadtogglepara ativar e desativar meu touchpad.

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

Mas o teclado não parece ter um módulo associado e o módulo psmouse funciona apenas ocasionalmente.

Usuário desconhecido
fonte
1

Se você estiver usando um ambiente de área de trabalho ou gerenciador de login (GNOME, KDE, XFCE, LXDE), quase todos eles têm uma função de tela de bloqueio, na qual é necessário digitar sua senha para voltar aos seus programas.

No entanto, como isso é realmente simples, sinto que seu problema é mais complexo / diferente.

loosecannon
fonte
Eu atualizei.
Philomath
1

Eu escrevi isso (em .zshrc, mas também deve funcionar .bashrc) para fazer isso, com a ajuda das respostas acima. Para fazer o correspondente com o teclado, altere o parâmetro em 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
fonte
Confira minha resposta para uma pergunta semelhante no SO - ele faz o mesmo, mas pode ser chamado de um tty e também (usando uma solução alternativa) oculta o ponteiro.
Emanuel Berg