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


27

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


カーネルレベル(もしそうなら、どのOS上)、Xレベル、ターミナルで入力をシミュレートしますか?
ジル「SO-悪であるのをやめる」

カーネルレベルでは、実際のキーボードで実際のキーを押したように見えるようにしたいのです。
ナフトゥリケイ

@TKKocheran:それで、AIXの下で?FreeBSD?Linux?OSX?…答えは、バリアントごとに完全に異なる可能性が高いです。
ジル「SO-悪であるのをやめる」

1
何のためにそれが必要ですか?
スターブルー

2
おそらく、ランダムな間隔でキー入力をランダムに挿入するスクリプトを書きたいと思います。
ナフトゥリケイ

回答:


23

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

xdotool key KEYSTROKE_SPECIFIER

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

編集:Gillesの質問に対するあなたの回答を逃しました、ごめんなさい。Xケースの解決策として、この応答をここに残します。


3
xte同じレベルで動作すると思います。
カスカベル

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のスナップショットに置き換えました。
プネヘヘ14年

これはこの質問の解決に役立つと思いますか?unix.stackexchange.com/questions/156985/…、キーを押すと、このプログラムは問題のあるアプリケーションが実際に認識する別のキーを(同時にでも)送ると思いましたか?
アクエリアスパワー14

Thiemongeのマウスを作成して移動するためのサンプルコードは、おそらくそれを教えても、それからキーストロークを作成する方法を理解できません。
セスタリアン

@CestarianこれはStack Overflowの質問のように聞こえます。コードを投稿し、期待する内容と代わりに表示される内容を説明し、関連するエラーメッセージ、ログエントリなどを提供します。
Gilles 'SO- stop being evil'

@Gillesよくやりたいのですが、質問の制限に達したということです。そしておそらく私が削除したはるかに古い質問に関するいくつかの詳細。地獄、なぜ私はここで多くのダウン票を獲得したのかさえ知りません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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.