Comment injecter des touches via un script shell?

27

J'essaie d'injecter des touches dans le démon d'entrée afin de simuler la saisie à partir d'un script Bash. Est-ce possible, et si oui, comment puis-je y arriver?

Naftuli Kay
la source
Voulez-vous simuler une entrée au niveau du noyau (si oui, sur quel OS), au niveau X, dans un terminal?
Gilles 'SO- arrête d'être méchant'
Au niveau du noyau, je voudrais qu'il apparaisse essentiellement comme si j'avais appuyé sur une touche réelle sur un clavier réel.
Naftuli Kay
@TKKocheran: Donc, sous AIX? FreeBSD? Linux? OSX? … La réponse est très susceptible d'être complètement différente sur chaque variante.
Gilles 'SO- arrête d'être méchant'
1
Pourquoi avez-vous besoin de ça?
starblue
2
J'aimerais peut-être écrire un script qui insère au hasard des touches à des intervalles aléatoires.
Naftuli Kay

Réponses:

23

Si vous opérez au niveau X (comme dans la question de Gilles), alors utilisez xdotool comme ceci:

xdotool key KEYSTROKE_SPECIFIER

Où KEYSTROKE_SPECIFIER peut être quelque chose comme "a" ou "F2" ou "control + j"

EDIT: J'ai raté votre réponse à la question de Gilles, désolé. Je vais laisser cette réponse ici comme une solution pour le cas X.

Pas certain
la source
3
Je pense que xtefonctionne au même niveau.
Cascabel
24

Utilisez le uinputpilote. Je ne pense pas qu'il y ait d'utilité pour cela; vous devrez écrire ou adapter un peu de code C. En un mot:

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

Références plus complètes:

Gilles 'SO- arrête d'être méchant'
la source
Le lien vers einfochips.com a été rompu. Je l'ai remplacé par un instantané de archive.org.
phunehehe
pensez-vous que cela pourrait aider à résoudre cette question? unix.stackexchange.com/questions/156985/… , je pensais que lorsque j'appuierais sur une touche, ce programme enverrait une autre clé que l'application problématique reconnaît réellement (même si en même temps)?
Aquarius Power
L'exemple de code de Thiemonge pour créer et déplacer une souris fonctionne, ne peut pas comprendre comment en faire des touches, même s'il l'enseigne censément.
Cestarian
@Cestarian Cela ressemble à une question pour Stack Overflow . Postez votre code, expliquez ce que vous attendiez et ce que vous voyez à la place, et fournissez tous les messages d'erreur pertinents, les entrées de journal, etc.
Gilles 'SO- arrêtez d'être maléfique'
@Gilles j'adorerais bien, mais ça dit que j'ai atteint ma limite de questions ... Pour avoir reçu trop de downvotes sur 2 questions que j'ai posées il y a quelque temps; et probablement un peu plus sur des questions beaucoup plus anciennes que j'ai supprimées. Enfer, je ne sais même pas pourquoi j'ai reçu autant de votes négatifs ici stackoverflow.com/questions/20619023/… (j'ai quand même une assez bonne réponse), est-ce parce que je n'ai pas posté l'erreur que je recevais peut-être? Quoi qu'il en soit, hors sujet. Fondamentalement, je le ferais, mais je ne peux pas. :(
Cestarian
9

Si vous ne travaillez PAS avec des programmes X avec des fenêtres pouvant recevoir des clés, vous recherchez probablement expectun programme pratique et très configurable pour exécuter d'autres programmes shell interactifs comme si un utilisateur contrôlait le terminal. Vous pouvez configurer des réponses programmatiques pour répondre à diverses sorties avec différentes entrées.

Caleb
la source
7

J'ai écrit du code Python qui fait ça. Vous pouvez le trouver dans mon projet open source.

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

Si vous exécutez ce module en tant que script en tant que root, vous pouvez voir une démo en action.

Cette fonctionnalité de base a été étendue pour un autre projet, powerdroid, qui fournit une implémentation plus concrète pour un système embarqué (Android).

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

Keith
la source