Come iniettare sequenze di tasti tramite uno script di shell?


27

Sto cercando di inserire sequenze di tasti nel demone di input in modo da simulare la digitazione da uno script Bash. È possibile, e se sì, come posso farlo accadere?


Vuoi simulare l'input a livello di kernel (in tal caso, su quale sistema operativo), a livello X, in un terminale?
Gilles 'SO- smetti di essere malvagio' il

A livello di kernel, mi piacerebbe che appaia essenzialmente come se premessi un tasto reale su una tastiera reale.
Naftuli Kay,

@TKKocheran: Quindi, sotto AIX? FreeBSD? Linux? OSX? ... È molto probabile che la risposta sia completamente diversa su ogni variante.
Gilles 'SO- smetti di essere malvagio' il

1
A cosa ti serve?
Starblue,

2
Forse mi piacerebbe scrivere una sceneggiatura che inserisca casualmente i tasti premuti a intervalli casuali.
Naftuli Kay,

Risposte:


23

Se stai operando a livello X (come nella domanda di Gilles), usa xdotool in questo modo:

xdotool key KEYSTROKE_SPECIFIER

Dove KEYSTROKE_SPECIFIER può essere qualcosa come "a" o "F2" o "control + j"

EDIT: Ho perso la tua risposta alla domanda di Gilles, scusa. Lascio qui questa risposta come soluzione per l'X-case.


3
Penso che xtefunzioni allo stesso livello.
Cascabel,

24

Usa il uinputdriver. Non penso che ci sia un'utilità per quello; dovrai scrivere o adattare un po 'di codice C. In breve:

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

Riferimenti più completi:


Il collegamento a einfochips.com è stato interrotto. L'ho sostituito con un'istantanea da archive.org.
phunehehe,

pensi che questo possa aiutare a risolvere questa domanda? unix.stackexchange.com/questions/156985/… , ho pensato, quando premevo un tasto, questo programma avrebbe inviato un altro tasto che l'applicazione problematica effettivamente riconosce (anche se allo stesso tempo)?
Aquarius Power il

Il codice di esempio di Thiemonge per la creazione e lo spostamento all'interno di un mouse funziona, non riesce a capire come fare sequenze di tasti, anche se presumibilmente lo insegna.
Cestarian

@Cestarian Sembra una domanda per Stack Overflow . Pubblica il tuo codice, spiega cosa ti aspetti e cosa vedi invece e fornisci eventuali messaggi di errore, voci di registro ecc.
Gilles "SO - smetti di essere malvagio"

@Gilles bene, mi piacerebbe, ma dice che ho raggiunto il limite delle mie domande ... Per ottenere troppi voti negativi su 2 domande che ho posto qualche tempo fa; e probabilmente un po 'di più su domande molto più vecchie che ho eliminato. Cavolo, non so nemmeno perché ho ottenuto così tanti downgrade qui stackoverflow.com/questions/20619023/… (ho ottenuto una risposta abbastanza buona), è stato perché non ho postato l'errore che stavo ricevendo forse? Comunque, fuori tema. Fondamentalmente lo farei ma non posso. :(
Cestarian

9

Se NON stai lavorando con programmi X con finestre che possono essere inviate chiavi, probabilmente stai cercando expectun programma pratico e molto configurabile per eseguire altri programmi di shell interattivi come se un utente controllasse il terminale. È possibile impostare risposte programmatiche per rispondere a vari output con input diversi.


7

Ho scritto del codice Python per farlo. Lo puoi trovare nel mio progetto open source.

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

Se esegui quel modulo come script come root puoi vedere una demo in azione.

Questa funzionalità di base è stata estesa per un altro progetto, powerdroid, che fornisce un'implementazione più concreta per un sistema incorporato (Android).

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.