Bagaimana cara menyuntikkan penekanan tombol melalui skrip shell?

27

Saya mencoba menyuntikkan penekanan tombol ke daemon input untuk mensimulasikan pengetikan dari skrip Bash. Apakah ini mungkin, dan jika demikian, bagaimana saya bisa mewujudkannya?

Naftuli Kay
sumber
Apakah Anda ingin mensimulasikan input pada level kernel (jika demikian, pada OS apa), pada level X, di terminal?
Gilles 'SANGAT berhenti menjadi jahat'
Pada tingkat kernel, saya ingin itu pada dasarnya muncul seolah-olah saya menekan tombol yang sebenarnya pada keyboard yang sebenarnya.
Naftuli Kay
@TKKocheran: Jadi, di bawah AIX? FreeBSD? Linux? OSX? ... Jawabannya sangat berbeda di setiap varian.
Gilles 'SANGAT berhenti menjadi jahat'
1
Untuk apa Anda membutuhkannya?
starblue
2
Mungkin saya ingin menulis skrip yang secara acak memasukkan penekanan tombol secara acak.
Naftuli Kay

Jawaban:

23

Jika Anda beroperasi di tingkat X (seperti dalam pertanyaan Gilles), maka gunakan xdotool seperti:

xdotool key KEYSTROKE_SPECIFIER

Di mana KEYSTROKE_SPECIFIER dapat berupa sesuatu seperti "a" atau "F2" atau "control + j"

EDIT: Saya melewatkan jawaban Anda untuk pertanyaan Gilles, maaf. Saya akan meninggalkan respons ini di sini sebagai solusi untuk kasus-X.

Tidak yakin
sumber
3
Saya pikir xteberoperasi pada level yang sama.
Cascabel
24

Gunakan uinputdrivernya. Saya tidak berpikir ada kegunaan untuk itu; Anda harus menulis atau mengadaptasi sedikit kode C. Pendeknya:

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

Referensi yang lebih lengkap:

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Tautan ke einfochips.com rusak. Saya menggantinya dengan snapshot dari archive.org.
phunehehe
Menurut Anda apakah ini dapat membantu menyelesaikan pertanyaan ini? unix.stackexchange.com/questions/156985/… , saya pikir, ketika saya menekan tombol, program ini akan mengirim kunci lain yang benar-benar dikenali oleh aplikasi yang bermasalah (bahkan jika pada saat bersamaan)?
Aquarius Power
Kode contoh Thiemonge untuk membuat dan bergerak di sekitar mouse berfungsi, tidak dapat menemukan cara membuat penekanan tombol meskipun itu seharusnya mengajarkan itu.
Cadangan
@ Konservasi Ini terdengar seperti pertanyaan untuk Stack Overflow . Poskan kode Anda, jelaskan apa yang Anda harapkan dan apa yang Anda lihat, dan berikan pesan kesalahan yang relevan, entri log, dll.
Gilles 'SO-stop being evil'
@Gilles, saya ingin sekali, tetapi dikatakan saya telah mencapai batas pertanyaan saya ... Untuk mendapatkan terlalu banyak downvotes pada 2 pertanyaan saya bertanya beberapa waktu lalu; dan mungkin lebih banyak lagi pada pertanyaan yang lebih lama saya hapus. Sial, saya bahkan tidak tahu mengapa saya mendapatkan begitu banyak downvotes di sini stackoverflow.com/questions/20619023/… (mendapat jawaban yang cukup bagus), apakah itu karena saya tidak memposting kesalahan yang saya terima mungkin? Bagaimanapun, di luar topik. Pada dasarnya saya akan tetapi tidak bisa. :(
Cadangan
9

Jika Anda TIDAK bekerja dengan program X dengan windows yang dapat mengirim kunci, Anda mungkin mencari expect, program yang praktis dan sangat dapat dikonfigurasi untuk menjalankan program shell interaktif lainnya seolah-olah pengguna mengendalikan terminal. Anda dapat mengatur respons terprogram untuk merespons berbagai output dengan input berbeda.

Caleb
sumber
7

Saya menulis beberapa kode Python yang melakukan itu. Anda dapat menemukannya di proyek open source saya.

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

Jika Anda menjalankan modul itu sebagai skrip sebagai root, Anda dapat melihat demo dalam aksi.

Fungsionalitas dasar ini diperluas untuk proyek lain, powerdroid, yang menyediakan implementasi lebih konkret untuk sistem tertanam (Android).

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

Keith
sumber