Wie füge ich Tastatureingaben über ein Shell-Skript ein?

27

Ich versuche, Tastatureingaben in den Eingabedämon einzufügen, um die Eingabe aus einem Bash-Skript zu simulieren. Ist das möglich, und wenn ja, wie kann ich das erreichen?

Naftuli Kay
quelle
Möchten Sie Eingaben auf Kernel-Ebene (wenn ja, auf welchem ​​Betriebssystem) auf X-Ebene in einem Terminal simulieren?
Gilles 'SO- hör auf böse zu sein'
Auf der Kernel-Ebene möchte ich, dass es im Wesentlichen so aussieht, als würde ich eine tatsächliche Taste auf einer tatsächlichen Tastatur drücken.
Naftuli Kay
@TKKocheran: Also unter AIX? FreeBSD? Linux? OSX? … Die Antwort ist höchstwahrscheinlich bei jeder Variante anders.
Gilles 'SO- hör auf böse zu sein'
1
Wofür braucht man das?
Starblue
2
Vielleicht möchte ich ein Skript schreiben, das in zufälligen Abständen zufällige Tastendrücke einfügt.
Naftuli Kay

Antworten:

23

Wenn Sie auf der X-Ebene arbeiten (wie in Gilles 'Frage), verwenden Sie xdotool wie folgt :

xdotool key KEYSTROKE_SPECIFIER

Wobei KEYSTROKE_SPECIFIER so etwas wie "a" oder "F2" oder "control + j" sein kann

EDIT: Ich habe Ihre Antwort auf Gilles 'Frage verpasst, sorry. Ich lasse diese Antwort hier als Lösung für den X-Fall.

Nicht sicher
quelle
3
Ich denke, xtearbeitet auf dem gleichen Niveau.
Cascabel,
24

Benutze den uinputFahrer. Ich glaube nicht, dass es dafür einen Nutzen gibt. Sie müssen ein bisschen C-Code schreiben oder anpassen. In einer Nussschale:

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

Vollständigere Referenzen:

Gilles 'SO - hör auf böse zu sein'
quelle
Der Link zu einfochips.com wurde unterbrochen. Ich habe es durch einen Schnappschuss von archive.org ersetzt.
Phunehehe
Glauben Sie, dass dies bei der Lösung dieser Frage hilfreich sein könnte? unix.stackexchange.com/questions/156985/… , dachte ich, wenn ich eine Taste drücke, würde dieses Programm eine andere Taste senden, die die problematische Anwendung tatsächlich erkennt (auch wenn gleichzeitig)?
Aquarius Power
Der Beispielcode von Thiemonge zum Erstellen und Bewegen einer Maus funktioniert, kann aber keine Tastatureingaben vornehmen, auch wenn er dies angeblich lehrt.
Cestarian
@Cestarian Dies klingt wie eine Frage für Stack Overflow . Hier können Sie Ihr Code, erklären , was Sie erwartet und was Sie sehen statt und bieten alle relevanten Fehlermeldungen, Protokolleinträge usw.
Gilles ‚SO- Anschlag, der böse‘
@ Gilles Nun, ich würde es lieben, aber es besagt, dass ich mein Fragenlimit erreicht habe ... Weil ich zu viele Abwertungen für 2 Fragen erhalten habe, habe ich vor einiger Zeit gefragt; und wahrscheinlich noch mehr zu viel älteren Fragen, die ich gelöscht habe. Zum Teufel , ich weiß nicht einmal, warum ich hier so viele Abwertungen erhalten habe. Stackoverflow.com/questions/20619023/… (bekam aber eine ziemlich gute Antwort). Jedenfalls nicht zum Thema. Grundsätzlich würde ich aber nicht können. :(
Cestarian
9

Wenn Sie NICHT mit X-Programmen mit Fenstern arbeiten, denen Schlüssel gesendet werden können, suchen Sie wahrscheinlich nach expecteinem praktischen und sehr konfigurierbaren Programm zum Ausführen anderer interaktiver Shell-Programme, als ob ein Benutzer das Terminal steuern würde. Sie können programmatische Reaktionen einrichten, um auf verschiedene Ausgaben mit unterschiedlichen Eingaben zu reagieren.

Caleb
quelle
7

Ich habe einen Python-Code geschrieben, der das macht. Sie finden es in meinem Open Source Projekt.

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

Wenn Sie dieses Modul als Skript als Root ausführen, können Sie eine Demo in Aktion sehen.

Diese Grundfunktionalität wurde für ein weiteres Projekt, powerdroid, erweitert, das eine konkretere Implementierung für ein eingebettetes System (Android) bietet.

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

Keith
quelle