如何通过Shell脚本注入击键?


27

我试图将击键注入到输入守护程序中,以模拟从Bash脚本进行的键入。这有可能吗?如果可以,我该如何实现呢?


您是否要在终端的X级别上在内核级别(如果是,在什么操作系统上)模拟输入?
吉尔(Gilles)'所以

在内核级别,我希望它看起来就像在实际键盘上按下实际键一样。
Naftuli Kay 2011年

@TKKocheran:那么,在AIX下?FreeBSD?Linux的?OSX?……每个变体的答案很可能完全不同。
吉尔斯(Gillles)“所以-不要再邪恶了”,

1
您需要什么呢?
starblue 2011年

2
也许我想编写一个脚本,以随机间隔随机插入按键。
Naftuli Kay 2011年

Answers:


23

如果您在X级别上进行操作(如Gilles的问题),请使用xdotool,如下所示:

xdotool key KEYSTROKE_SPECIFIER

其中KEYSTROKE_SPECIFIER可以是“ a”或“ F2”或“ control + j”

编辑:对不起,我想念您对吉尔斯的问题的答复。我将在此保留此响应作为X案例的解决方案。


3
我认为xte在同一级别上运行。
卡斯卡贝尔2011年

24

使用uinput驱动程序。我认为没有任何用途。您将不得不编写或改编一些C代码。简而言之:

#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/…,我以为,当我按下一个键时,该程序会发送有问题的应用程序实际识别的另一个键(即使同时)?
Aquarius Power

Thiemonge的用于创建和在鼠标周围移动的示例代码可以正常工作,尽管它据说可以做到这一点,但仍无法弄清如何用鼠标进行击键。
Cestarian'Mar

@Cestarian这听起来像是Stack Overflow的问题。发布您的代码,解释你预期的,你看,而不是什么,并提供一切有关的错误信息,日志记录等
吉尔“SO-停止作恶”

@Gilles我很乐意,但是它说我已经达到我的问题极限了。可能还有一些我删除的更老的问题。地狱,我什至不知道为什么我在这里得到了如此之多的下降票stackoverflow.com/questions/20619023/…(虽然得到了一个很好的答案),是因为我没有张贴我可能收到的错误吗?无论如何,不​​关话题。基本上我会但不能。:(
Cestarian

9

如果您不使用带有可发送键的Windows的X程序,则可能正在寻找expect一个方便且非常可配置的程序,用于运行其他交互式Shell程序,就像用户在控制终端一样。您可以设置程序响应,以响应具有不同输入的各种输出。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.