linux: detecta se o teclado externo está conectado ao laptop

1

Tenho um laptop OSX com Ubuntu Virtualbox em execução e interajo com o teclado do laptop ou com um teclado USB externo que eu conecto quando estou no escritório.

Existe um script que eu poderia executar para detectar se o teclado externo está conectado para que o mapa de teclado no Ubuntu Virtualbox seja alterado adequadamente?

Atualmente eu manualmente executo 'mac' ou 'key' que executa este comando:

setxkbmap -layout gb

ou

xmodmap .Xmodmap

Eu gostaria de fazer o mesmo automaticamente quando o teclado estiver conectado ou desconectado. Alguma idéia?

    
por 719016 07.03.2016 / 14:36

1 resposta

1

Você pode usar uma udev -rule para isso. No meu exemplo eu estou usando um dongle USB para o meu mouse sem fio, você terá que ajustar de acordo:

1. Obtendo os identificadores

Para criar uma regra exclusiva para o dispositivo, precisamos identificá-lo corretamente. Use a saída de udevadm para isso (seu teclado USB deve aparecer em /dev/usb/<device> . Conecte e desconecte para ver se este dispositivo (dis) aparece). Os IDs do fornecedor e do dispositivo devem ser únicos o suficiente, mas quanto mais correspondências, melhor.

udeadm info -a -n /dev/usb/hiddev0 | grep 'idVendor\|idProduct'
ATTRS{idVendor}=="0e8f"
ATTRS{idProduct}=="00a4"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"

Observe os dois valores que correspondem à saída de lsusb na ID (para saber qual dispositivo é esse, testar a diferença de lsubs com e sem o teclado ou ver se você pode corresponder os nomes na saída )

lsusb
Bus 005 Device 004: ID 0e8f:00a4 GreenAsia Inc.

Portanto, usaremos 0e8f e 00a4 para o fornecedor e o ID do produto, respectivamente.

2. Criando uma regra

A regra em si é apenas uma listagem do que fazer. Salve em /etc/udev/rules.d/ como, e. keyboard.rules (observe que o sufixo .rules é obrigatório). O arquivo corresponderá a ( == ) alguns atributos, a ação e executará nosso script:

ACTION=="add", ATTRS{idVendor}=="0e8f", ATTRS{idProduct}=="00a4", RUN+="/full/path/to/script.sh"

Você pode ter problemas com a parte ACTION=="remove" , ler esta . O problema é que alguns dos atributos são excluídos após a remoção e, portanto, udev não pode mais correspondê-los à sua regra de remoção.

No meu caso eu usei udeadm monitor --environemnt e desconectei o devive. Eu selecionei

ID_MODEL_ID=00a4

e usou isso como o único requisito (talvez seja necessário fazer um pouco de tentativa e erro para boas correspondências aqui, no entanto, uma única correspondência é mais fácil de salvar apenas para o caso de alterar os keymaps). Observe que a regra de remoção precisa de ENV em vez de ATTRS (AFAIK ENV também funciona para a regra de plug-in, mas ATTRS falha na remoção)

ACTION=="remove", ENV{ID_MODEL_ID}=="00a4", RUN+="/path/to/removal_script.sh"

As regras para adicionar e remover podem ser um arquivo com uma linha para cada ação.

3. O script

O script SEMPRE será executado por root , portanto, certifique-se de que a) seja gravável apenas por root (por motivos de segurança) b) se seu comando precisar ser executado por um usuário, use sudo -u user1 command no script. Deve ser executável, claro. Se você estiver tentando executar diretamente um comando (ou seja, sem usar um script), use o caminho absoluto do comando.

Boa sorte.

    
por 08.03.2016 / 15:08