Como injetar pressionamentos de tecla através de um shell script?

27

Estou tentando inserir as teclas digitadas no daemon de entrada para simular a digitação de um script Bash. Isso é possível? Em caso afirmativo, como posso fazer isso acontecer?

Naftuli Kay
fonte
Deseja simular a entrada no nível do kernel (se sim, em qual SO), no nível X, em um terminal?
Gilles 'SO- stop be evil'
No nível do kernel, eu gostaria que ele parecesse essencialmente como se eu pressionasse uma tecla real em um teclado real.
Naftuli Kay 12/06
@TKKocheran: Então, no AIX? FreeBSD? Linux? OSX? ... É altamente provável que a resposta seja completamente diferente em cada variante.
Gilles 'SO- stop be evil'
11
Para que você precisa disso?
starblue
2
Talvez eu queira escrever um script que insira aleatoriamente pressionamentos de tecla em intervalos aleatórios.
Naftuli Kay

Respostas:

23

Se você estiver operando no nível X (como na pergunta de Gilles), use o xdotool da seguinte forma:

xdotool key KEYSTROKE_SPECIFIER

Onde KEYSTROKE_SPECIFIER pode ser algo como "a" ou "F2" ou "control + j"

EDIT: Perdi sua resposta à pergunta de Gilles, desculpe. Deixarei essa resposta aqui como uma solução para o caso X.

Não tenho certeza
fonte
3
Eu acho que xteopera no mesmo nível.
Cascabel
24

Use o uinputdriver. Não acho que exista utilidade para isso; você precisará escrever ou adaptar um pouco de código C. Em poucas palavras:

#include <fcntl.h>
#include <ioctl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/uinput.h>
/* Set up a fake keyboard device */
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); // or /dev/input/uinput
ioctl(fd, UI_SET_EVBIT, EV_KEY);
struct uinput_user_dev uidev = …;
write(fd, &uidev, sizeof(uidev));
ioctl(fd, UI_DEV_CREATE);
/* Send an event */
struct input_event ev = …;
write(fd, &ev, sizeof(ev));
/* Clean up */
ioctl(fd, UI_DEV_DESTROY);
close(fd);

Referências mais completas:

Gilles 'SO- parar de ser mau'
fonte
O link para einfochips.com foi quebrado. Substituí-lo por um instantâneo de archive.org.
phunehehe
você acha que isso poderia ajudar a resolver esta questão? unix.stackexchange.com/questions/156985/… , pensei que, ao pressionar uma tecla, este programa enviaria outra tecla que o aplicativo problemático realmente reconhece (mesmo que ao mesmo tempo)?
Aquário Potência
O código de exemplo do Thiemonge para criar e mover o mouse funciona, mas não é possível descobrir como pressionar as teclas, mesmo que supostamente ensine isso.
Cestarian
@ Cestarian Isso soa como uma pergunta para Stack Overflow . Publique seu código, explique o que você esperava e o que vê, e forneça mensagens de erro relevantes, entradas de log etc.
Gilles 'SO- stop be evil'
@Gilles bem, eu adoraria, mas diz que atingi meu limite de perguntas ... Por ter recebido muitos votos negativos em duas perguntas, perguntei há um tempo; e provavelmente um pouco mais sobre questões muito mais antigas que apaguei. Inferno, eu nem sei por que recebi tantos votos negativos aqui stackoverflow.com/questions/20619023/… (recebi uma resposta muito boa), foi porque eu não postei o erro que estava recebendo, talvez? De qualquer forma, fora do tópico. Basicamente, eu faria, mas não posso. :(
Cestarian
9

Se você NÃO está trabalhando com programas X com janelas que podem receber chaves, provavelmente está procurando expectum programa prático e muito configurável para executar outros programas shell interativos, como se um usuário estivesse controlando o terminal. Você pode configurar respostas programáticas para responder a várias saídas com entradas diferentes.

Caleb
fonte
7

Eu escrevi algum código Python que faz isso. Você pode encontrá-lo no meu projeto de código aberto.

http://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/event.py

Se você executar esse módulo como um script como root, poderá ver uma demonstração em ação.

Essa funcionalidade básica foi estendida para outro projeto, o powerdroid, que fornece uma implementação mais concreta para um sistema incorporado (Android).

http://code.google.com/p/powerdroid/source/browse/trunk/src/droid/devices.py

Keith
fonte