Tuş vuruşlarını bir kabuk betiği ile nasıl enjekte edebilirim?


27

Bir basım betiğinden yazmayı simüle etmek için giriş daemonuna tuş vuruşlarını enjekte etmeye çalışıyorum. Bu mümkün mü ve eğer öyleyse, bunu nasıl başarabilirim?


Girdiyi çekirdek düzeyinde (eğer öyleyse, hangi işletim sisteminde) X düzeyinde, bir terminalde simüle etmek istersiniz?
Gilles 'SO- kötülük olmayı bırak'

Çekirdek düzeyinde, aslında gerçek bir klavyede gerçek bir tuşa basmış gibi görünmesini istiyorum.
Naftuli Kay

@TKKocheran: Yani, AIX altında mı? FreeBSD? Linux? OSX? … Cevabın, her değişkende tamamen farklı olması muhtemeldir.
Gilles 'SO- kötülük olmayı bırak'

1
Buna ne için ihtiyacın var?
starblue

2
Belki de rastgele aralıklarla tuşlara rastgele ekleyen bir senaryo yazmak istiyorum.
Naftuli Kay

Yanıtlar:


23

X düzeyinde çalışıyorsanız ( Gilles'un sorusunda olduğu gibi ), o zaman xdotool kullanın :

xdotool key KEYSTROKE_SPECIFIER

KEYSTROKE_SPECIFIER "a" veya "F2" veya "control + j" gibi bir şey olabilir.

EDIT: Gilles sorusuna cevabını kaçırdım, üzgünüm. Bu cevabı burada X davası için bir çözüm olarak bırakacağım.


3
Sanırım xteaynı seviyede çalışıyor.
Cascabel

24

uinputSürücüyü kullan . Bunun bir faydası olduğunu sanmıyorum; Biraz C kodu yazmanız veya uyarlamanız gerekecek. Kısaca:

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

Daha eksiksiz referanslar:


Einfochips.com bağlantısı kesildi. Ben bunu archive.org'daki anlık görüntü ile değiştirdim.
phunehehe

Bunun bu soruyu çözmede yardımcı olabileceğini düşünüyor musunuz? unix.stackexchange.com/questions/156985/… , bir tuşa bastığımda , bu programın sorunlu uygulamanın gerçekten tanıdığı başka bir anahtar göndereceğini düşündüm (aynı zamanda da olsa)?
Kova Gücü

Thiemonge'ın bir fare oluşturma ve hareket etme konusundaki örnek kodu, sözde öğretse bile, ondan nasıl tuşa basılacağını çözemez.
Cestarian

@Cestarian Bu Stack Overflow için bir soru gibi geliyor . Ne beklediğiniz ve ne yerine bakın açıklamak, kodunuzu yayınlayın ve ilgili hata iletileri sağlamak, log kayıtları vb
Gilles 'SO dur olma kötülük'

@Gilles iyi isterdim, ama soru limitime ulaştığımı söylüyor ... 2 soru hakkında çok fazla aşağı oy almak için bir süre önce sordum; ve muhtemelen biraz daha eski sorularda sildim. Cehennem, neden bu kadar çok aşağı oy aldığımı bile bilmiyorum stackoverflow.com/questions/20619023/… (oldukça iyi bir cevap aldım), belki de aldığım hatayı göndermediğim için miydi? Her neyse, konu dışı. Temelde yapardım ama yapamam. :(
Cestarian

9

Anahtarları gönderilebilen pencereli X programlarıyla çalışmıyorsanız, muhtemelen expectbir kullanıcı terminalini kontrol ediyormuş gibi diğer etkileşimli kabuk programlarını çalıştırmak için kullanışlı ve yapılandırılabilir bir program arıyorsunuz . Farklı girdilere sahip çeşitli çıktılara cevap vermek için programlı yanıtlar ayarlayabilirsiniz.


7

Bunu yapan bir Python kodu yazdım. Açık kaynaklı projemde bulabilirsiniz.

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

Bu modülü root olarak bir script olarak çalıştırırsanız, bir demoyu çalışırken görebilirsiniz.

Bu temel işlevsellik, gömülü bir sistem (Android) için daha somut bir uygulama sağlayan powerdroid adlı başka bir proje için genişletildi.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.