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

24

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

    
por Naftuli Kay 13.06.2011 / 00:21

4 respostas

20

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

xdotool key KEYSTROKE_SPECIFIER

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

EDIT: Eu senti falta da sua resposta à pergunta de Gilles, desculpe. Deixarei esta resposta aqui como uma solução para o caso X.

    
por 13.06.2011 / 03:40
23

Use o driver uinput . Eu não acho que haja utilidade para isso; você vai ter que 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:

por 13.06.2011 / 02:08
8

Se você NÃO estiver trabalhando com programas X com Windows que podem ser chaves enviadas, provavelmente está procurando expect , um 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.

    
por 13.06.2011 / 11:03
7

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

link

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

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

link

    
por 13.06.2011 / 03:44