Làm thế nào để tiêm tổ hợp phím thông qua tập lệnh shell?


27

Tôi đang cố gắng đưa tổ hợp phím vào trình nền đầu vào để mô phỏng việc gõ từ tập lệnh Bash. Điều này là có thể, và nếu vậy, làm thế nào tôi có thể làm cho nó xảy ra?


Bạn có muốn mô phỏng đầu vào ở cấp kernel (nếu vậy, trên hệ điều hành nào), ở cấp X, trong một thiết bị đầu cuối không?
Gilles 'SO- ngừng trở nên xấu xa'

Ở cấp độ kernel, tôi muốn nó cơ bản xuất hiện như thể tôi nhấn một phím thực trên bàn phím thực.
Naftuli Kay

@TKKocheran: Vậy, dưới AIX? FreeBSD? Linux? OSX? Câu trả lời rất có thể là hoàn toàn khác nhau trên mỗi biến thể.
Gilles 'SO- ngừng trở nên xấu xa'

1
Bạn cần cái đó để làm gì?
starblue

2
Có lẽ tôi muốn viết một kịch bản chèn ngẫu nhiên các phím bấm theo các khoảng thời gian ngẫu nhiên.
Naftuli Kay

Câu trả lời:


23

Nếu bạn đang hoạt động ở cấp X (như trong câu hỏi của Gilles), thì hãy sử dụng xdotool như vậy:

xdotool key KEYSTROKE_SPECIFIER

Trong đó KEYSTROKEinksECIFIER có thể là một cái gì đó như "a" hoặc "F2" hoặc "control + j"

EDIT: Tôi đã bỏ lỡ câu trả lời của bạn cho câu hỏi của Gilles, xin lỗi. Tôi sẽ để lại phản hồi này ở đây như là một giải pháp cho trường hợp X.


3
Tôi nghĩ xtehoạt động ở cùng cấp độ.
Cascabel

24

Sử dụng uinputtrình điều khiển. Tôi không nghĩ rằng có một tiện ích cho việc đó; bạn sẽ phải viết hoặc điều chỉnh một chút mã C. Tóm lại:

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

Tài liệu tham khảo đầy đủ hơn:


Liên kết đến einfochips.com đã bị hỏng. Tôi đã thay thế nó bằng một ảnh chụp nhanh từ archive.org.
phunehehe

Bạn có nghĩ rằng điều này có thể giúp giải quyết câu hỏi này? unix.stackexchange.com/questions/156985/ , tôi nghĩ, khi tôi nhấn một phím, chương trình này sẽ gửi một khóa khác mà ứng dụng có vấn đề thực sự nhận ra (ngay cả khi cùng một lúc)?
Sức mạnh Bảo Bình

Mã mẫu của Thiemonge để tạo và di chuyển xung quanh một con chuột hoạt động, không thể tìm ra cách tạo tổ hợp phím từ nó ngay cả khi nó được cho là dạy điều đó.
Cestarian

@Cestarian Điều này nghe giống như một câu hỏi cho Stack Overflow . Gửi mã của bạn, giải thích những gì bạn mong đợi và những gì bạn thấy thay vào đó và cung cấp bất kỳ thông báo lỗi có liên quan, các mục nhật ký, v.v.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles tôi cũng rất thích, nhưng nó nói rằng tôi đã đạt đến giới hạn câu hỏi của mình ... Vì đã nhận quá nhiều câu trả lời cho 2 câu hỏi tôi đã hỏi một lúc trước; và có lẽ một số chi tiết về các câu hỏi cũ hơn tôi đã xóa. Chết tiệt, tôi thậm chí không biết tại sao tôi lại nhận được rất nhiều lượt tải xuống ở đây stackoverflow.com/questions/20619023/ (mặc dù đã có một câu trả lời khá hay), có phải vì tôi đã không đăng lỗi tôi có thể nhận được không? Nhưng dù sao, lạc đề. Về cơ bản tôi sẽ nhưng không thể. :(
Cestarian

9

Nếu bạn KHÔNG làm việc với các chương trình X có cửa sổ có thể gửi khóa, có lẽ bạn đang tìm kiếm expect, một chương trình tiện dụng và rất có thể định cấu hình để chạy các chương trình shell tương tác khác như thể người dùng đang điều khiển thiết bị đầu cuối. Bạn có thể thiết lập các phản hồi theo chương trình để đáp ứng đầu ra khác nhau với các đầu vào khác nhau.


7

Tôi đã viết một số mã Python làm điều đó. Bạn có thể tìm thấy nó trong dự án nguồn mở của tôi.

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

Nếu bạn chạy mô-đun đó dưới dạng tập lệnh với quyền root, bạn có thể thấy bản demo đang hoạt động.

Chức năng cơ bản này đã được mở rộng cho một dự án khác, powerdroid, cung cấp triển khai cụ thể hơn cho một hệ thống nhúng (Android).

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.