Как вводить нажатия клавиш через скрипт оболочки?


27

Я пытаюсь ввести нажатия клавиш в демон ввода, чтобы имитировать типизацию из сценария Bash. Возможно ли это, и если да, то как я могу это сделать?


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

На уровне ядра, я бы хотел, чтобы это выглядело так, как будто я нажимаю настоящую клавишу на реальной клавиатуре.
Нафтули Кей

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

1
Зачем тебе это?
звездный синий

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

Ответы:


23

Если вы работаете на уровне X (как в вопросе Жиля), используйте xdotool следующим образом:

xdotool key KEYSTROKE_SPECIFIER

Где KEYSTROKE_SPECIFIER может быть что-то вроде «a» или «F2» или «control + j»

РЕДАКТИРОВАТЬ: я пропустил ваш ответ на вопрос Жиля, извините. Я оставлю этот ответ здесь как решение для 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/… , я думал, когда я нажимаю клавишу, эта программа отправит другую клавишу, которую проблемное приложение на самом деле распознает (даже если в то же время)?
Водолей Power

Пример кода Thiemonge для создания и перемещения мыши работает, он не может понять, как нажимать на него клавиши, хотя даже если он и учит этому.
Cestarian

@Cestarian Это звучит как вопрос для переполнения стека . Опубликуйте свой код, объясните, что вы ожидали и что вы видите вместо этого, и предоставьте все соответствующие сообщения об ошибках, записи в журнале и т. Д.
Жиль "ТАК, перестань быть злым"

@ Хорошо, я бы с удовольствием, но там написано, что я достиг предела своих вопросов ... За то, что получил слишком много отрицательных ответов на 2 вопроса, которые я задал некоторое время назад; и, возможно, еще несколько вопросов, которые я удалил. Черт, я даже не знаю, почему у меня так много отрицательных отзывов здесь 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.