วิธีฉีด keystrokes ผ่านเชลล์สคริปต์


27

ฉันพยายามกดแป้นพิมพ์ลงในภูตอินพุตเพื่อจำลองการพิมพ์จากสคริปต์ Bash เป็นไปได้และถ้าเป็นเช่นนั้นฉันจะทำให้มันเกิดขึ้นได้อย่างไร


คุณต้องการจำลองอินพุตที่ระดับเคอร์เนล (ถ้าเป็นเช่นนั้นบน OS ใด) ที่ระดับ X ในเทอร์มินัลหรือไม่?
Gilles 'หยุดความชั่วร้าย'

ในระดับเคอร์เนลฉันต้องการให้มันปรากฏเป็นหลักราวกับว่าฉันกดปุ่มจริงบนแป้นพิมพ์จริง
Naftuli Kay

@TKKocheran: ดังนั้นภายใต้ AIX? FreeBSD? ลินุกซ์? OSX? ... คำตอบมีความเป็นไปได้สูงที่จะแตกต่างกันอย่างสิ้นเชิงในแต่ละรุ่น
Gilles 'SO- หยุดความชั่วร้าย'

1
คุณต้องการอะไร
starblue

2
บางทีฉันอาจต้องการเขียนสคริปต์ที่จะแทรกการกดคีย์เป็นระยะ ๆ แบบสุ่ม
Naftuli Kay

คำตอบ:


23

หากคุณทำงานที่ระดับ X (เช่นในคำถามของ Gilles) ให้ใช้xdotoolดังนี้:

xdotool key KEYSTROKE_SPECIFIER

โดยที่ KEYSTROKE_SPECIFIER สามารถเป็นได้เช่น "a" หรือ "F2" หรือ "control + j"

แก้ไข: ฉันไม่ได้รับการตอบคำถาม Gilles ของคุณขอโทษ ฉันจะปล่อยให้การตอบสนองนี้ที่นี่เป็นทางออกสำหรับกรณี X-


3
ฉันคิดว่าxteทำงานในระดับเดียวกัน
Cascabel

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/ …ฉันคิดว่าเมื่อฉันกดแป้นโปรแกรมนี้จะส่งคีย์อื่นที่แอปพลิเคชันที่เป็นปัญหาได้รับรู้จริง (แม้ว่าในเวลาเดียวกัน)?
กุมภ์อำนาจ

โค้ดตัวอย่างของ Thiemonge สำหรับการสร้างและเคลื่อนย้ายเมาส์ทำงานไม่สามารถหาวิธีที่จะทำการกดแป้นได้แม้ว่าจะสอนตามนั้นก็ตาม
Cestarian

@Cestarian เสียงนี้เหมือนคำถามสำหรับกองมากเกิน โพสต์รหัสของคุณอธิบายสิ่งที่คุณคาดหวังและสิ่งที่คุณเห็นแทนและให้ข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องบันทึกรายการอื่น ๆ
Gilles 'ดังนั้นหยุดความชั่วร้าย'

@Gilles ดีฉันชอบ แต่มันก็บอกว่าฉันได้ถึงขีด จำกัด ของคำถาม ... สำหรับการ downvotes มากเกินไปใน 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

หากคุณเรียกใช้โมดูลนั้นเป็นสคริปต์ในฐานะรูทคุณสามารถดูตัวอย่างการทำงานได้

ฟังก์ชั่นพื้นฐานนี้ถูกขยายออกไปสำหรับโครงการอื่นคือ powerdroid ที่ให้การใช้งานที่เป็นรูปธรรมมากขึ้นสำหรับระบบสมองกลฝังตัว (Android)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.