web-dev-qa-db-ja.com

シェルスクリプトを介してキーストロークを挿入する方法

Bashスクリプトからのタイピングをシミュレートするために、入力デーモンにキーストロークを注入しようとしています。これは可能ですか?可能であれば、どうすれば実現できますか?

27
Naftuli Kay

Xレベルで操作している場合(Gillesの質問のように)、次のように xdotool を使用します。

xdotool key KEYSTROKE_SPECIFIER

KEYSTROKE_SPECIFIERは、「a」、「F2」、または「control + j」のようになります。

編集:ギレスの質問への回答を逃しました、申し訳ありません。ここでは、Xケースの解決策としてこの応答を残します。

23
Not Sure

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

より完全なリファレンス:

キーを送信できるウィンドウを備えたXプログラムを使用していない場合は、おそらく expect を探しているでしょう。ユーザーが端末を制御していた。さまざまな入力でさまざまな出力に応答するようにプログラム的な応答を設定できます。

9
Caleb

私はいくつかのPythonそれを行うコードを書きました。私のオープンソースプロジェクトで見つけることができます。

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

そのモジュールをスクリプトとしてrootとして実行すると、実際のデモを見ることができます。

この基本機能は、組み込みシステム(Android)のより具体的な実装を提供する別のプロジェクトpowerdroidに拡張されました。

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

7
Keith