¿Cómo inyectar pulsaciones de teclas a través de un script de shell?

27

Estoy tratando de inyectar pulsaciones de teclas en el daemon de entrada para simular escribir desde un script Bash. ¿Es esto posible y, de ser así, cómo puedo hacer que suceda?

Naftuli Kay
fuente
¿Desea simular la entrada en el nivel del núcleo (si es así, en qué sistema operativo), en el nivel X, en un terminal?
Gilles 'SO- deja de ser malvado'
A nivel del núcleo, me gustaría que parezca esencialmente como si presionase una tecla real en un teclado real.
Naftuli Kay
@TKKocheran: Entonces, ¿bajo AIX? FreeBSD? Linux? OSX? ... Es muy probable que la respuesta sea completamente diferente en cada variante.
Gilles 'SO- deja de ser malvado'
1
¿Para qué necesitas eso?
Starblue
2
Tal vez me gustaría escribir un script que inserte pulsaciones de teclas al azar a intervalos aleatorios.
Naftuli Kay

Respuestas:

23

Si está operando en el nivel X (como en la pregunta de Gilles), use xdotool así:

xdotool key KEYSTROKE_SPECIFIER

Donde KEYSTROKE_SPECIFIER puede ser algo como "a" o "F2" o "control + j"

EDITAR: Perdí tu respuesta a la pregunta de Gilles, lo siento. Dejaré esta respuesta aquí como una solución para el caso X.

No es seguro
fuente
3
Creo que xteopera al mismo nivel.
Cascabel
24

Usa el uinputconductor. No creo que haya una utilidad para eso; Tendrás que escribir o adaptar un poco de código C. En una palabra:

#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);

Referencias más completas:

Gilles 'SO- deja de ser malvado'
fuente
El enlace a einfochips.com estaba roto. Lo reemplacé con una instantánea de archive.org.
phunehehe
¿Crees que esto podría ayudar a resolver esta pregunta? unix.stackexchange.com/questions/156985/… , pensé, cuando presiono una tecla, ¿este programa enviaría otra tecla que la aplicación problemática realmente reconoce (aunque sea al mismo tiempo)?
Acuario Power
El código de muestra de Thiemonge para crear y moverse alrededor de un mouse funciona, aunque no puede encontrar la manera de hacer pulsaciones de teclas, incluso si supuestamente enseña eso.
Cestarian
@Cestarian Esto suena como una pregunta para Stack Overflow . Publique su código, explique lo que esperaba y lo que ve en su lugar, y proporcione cualquier mensaje de error relevante, entradas de registro, etc.
Gilles 'SO- deje de ser malvado'
@Gilles bueno, me encantaría, pero dice que he alcanzado el límite de mi pregunta ... Por haber recibido demasiados votos negativos en 2 preguntas, pregunté hace un tiempo; y probablemente algo más sobre preguntas mucho más antiguas que eliminé. Demonios, ni siquiera sé por qué obtuve tantos votos negativos aquí stackoverflow.com/questions/20619023/… (aunque obtuve una respuesta bastante buena), ¿fue porque no publiqué el error que estaba recibiendo tal vez? De todos modos, fuera de tema. Básicamente lo haría pero no puedo. :(
Cestarian
9

Si NO está trabajando con programas X con ventanas a las que se pueden enviar claves, probablemente esté buscando expectun programa práctico y muy configurable para ejecutar otros programas de shell interactivos como si un usuario estuviera controlando el terminal. Puede configurar respuestas programáticas para responder a varias salidas con diferentes entradas.

Caleb
fuente
7

Escribí un código de Python que hace eso. Puedes encontrarlo en mi proyecto de código abierto.

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

Si ejecuta ese módulo como un script como root, puede ver una demostración en acción.

Esta funcionalidad básica se amplió para otro proyecto, powerdroid, que proporciona una implementación más concreta para un sistema integrado (Android).

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

Keith
fuente