Як вводити натискання клавіш за допомогою сценарію оболонки?


27

Я намагаюся вводити натискання клавіш у вхідний демон, щоб імітувати введення тексту зі сценарію Bash. Чи можливо це, і якщо так, то як я можу це зробити?


Ви хочете імітувати вхід на рівні ядра (якщо так, на якій ОС), на рівні X, у терміналі?
Жиль "ТАК - перестань бути злим"

На рівні ядра я хотів би, щоб він по суті виглядав так, ніби я натиснув фактичну клавішу на фактичній клавіатурі.
Нафтулі Кей

@TKKocheran: Отже, під AIX? FreeBSD? Linux? OSX? … Ймовірно, що відповідь буде абсолютно різним у кожному варіанті.
Жиль "ТАК - перестань бути злим"

1
Для чого це потрібно?
starblue

2
Можливо, я хотів би написати сценарій, який випадковим чином вставляє натискання клавіш через випадкові проміжки часу.
Нафтулі Кей

Відповіді:


23

Якщо ви працюєте на рівні X (як у питанні Жиля), використовуйте xdotool так:

xdotool key KEYSTROKE_SPECIFIER

Де KEYSTROKE_SPECIFIER може бути чимось на зразок "a" або "F2" або "control + j"

EDIT: Я пропустив вашу відповідь на питання Гілла, вибачте. Я залишу цю відповідь тут як рішення для X-справи.


3
Я думаю, що xteпрацює на тому ж рівні.
Каскабель

24

Використовуйте uinputдрайвер. Я не думаю, що для цього є корисна програма; вам доведеться написати або адаптувати трохи коду С. Коротко:

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

Більш повні посилання:


Посилання на einfochips.com було порушено. Я замінив його знімком із archive.org.
phunehehe

ви вважаєте, що це може допомогти у вирішенні цього питання? unix.stackexchange.com/questions/156985/… , я думав, що після натискання клавіші ця програма надішле ще одну клавішу, яку проблемне додаток насправді розпізнає (навіть якщо одночасно)?
Сила Водолія

Зразок коду Thiemonge для створення та переміщення миші працює, не може зрозуміти, як зробити з нього натискання клавіш, хоча навіть якщо він нібито цьому вчить.
Cestarian

@Cestarian Це звучить як запитання щодо переповнення стека . Розмістіть свій код, поясніть, що ви очікували, і що ви бачите замість цього, і вкажіть відповідні повідомлення про помилки, записи в журналі тощо.
Жил "ТАК - перестаньте бути злим"

@Gilles добре, я б хотів, але це говорить, що я досяг мого питання ... За те, що я отримав занадто багато зворотних запитань на 2 запитання, я задав час назад; і, мабуть, дещо з набагато старих питань, які я видалив. Чорт, я навіть не знаю , чому я так багато downvotes тут stackoverflow.com/questions/20619023 / ... (отримав досить хороший відповідь , хоча), це було тому , що я не відправляв помилку я отримував , може бути? У всякому разі, поза темою. В основному я би, але не можу. :(
Cestarian

9

Якщо ви НЕ працюєте з програмами X із вікнами, на які можна надіслати ключі, ви, ймовірно, шукаєте expect, зручну та дуже настроювану програму для запуску інших інтерактивних програм оболонки, як ніби користувач керує терміналом. Ви можете налаштувати програмні відповіді, щоб відповідати на різні вихідні дані з різними входами.


7

Я написав деякий код Python, який це робить. Ви можете знайти його в моєму проекті з відкритим кодом.

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

Якщо ви запускаєте цей модуль як сценарій як root, ви можете бачити демонстрацію в дії.

Ця основна функціональність була розширена для іншого проекту, powerdroid, який забезпечує більш конкретну реалізацію вбудованої системи (Android).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.