ここにある回答の助けを借りて、以下のスクリプトを使用してVGAコンソールにキーストロークを送信できました。/dev/tty1
#!/usr/bin/perl
use warnings;
use strict;
open( my $TTY1 , '>' , '/dev/tty2' ) or die "Cannot open terminal for output: $!";
my $line = <STDIN>;
chomp($line);
for my $chr ( split( // , $line ) ) {
ioctl $TTY1 , 0x5412 , $chr or die "ioctl returned an error: $!";
}
# Wait a bit to allow for inspection of the result using setterm.
sleep 3;
# Then send an Enter.
my $chr="\n";
ioctl $TTY1 , 0x5412 , $chr or die "ioctl returned an error: $!";
close( $TTY1 );
これは次のようにテストできます。
echo -e 'date' | sudo /tmp/stdin2keyboard-buffer
VGAコンソールの現在の状態を次のように確認します。
watch sudo setterm -dump 2 -file /dev/stdout
ここで、2はvgaコンソールに返された番号を示し、tty
上記のopenステートメントで正しいttyデバイスに設定する必要があります。カーソルを上に送信してEnterを入力すると、シェル履歴の最後のコマンドが実行されます。
echo -e '\e[A' | sudo /tmp/stdin2keyboard-buffer
今私が本当に欲しいのは、Shift + PgUpをコンソールに送信して、VGAコンソールの後ろにスクロールすることもできるようにすることです。しかし、Shift PgUpのエスケープシーケンスを見つけることができないようです。
もう1つのアプローチは、/ dev / vcsaのバッファ全体をダンプする方法を見つけることです。しかし、デバイスドライバがそれをサポートしていないか、まだ方法を見つけることができませんでした。とにかくsettermバイナリはこれをサポートしていません。
答え1
キーストロークを送信しません。
不要なTIOCSTI
I / Oコントロールは、端末デバイスの入力ストリームに文字を挿入します。この流れが結果です後ろにキーストロークが一連の文字に変換されました。端末から入力を読み取るアプリケーションに表示される(生)文字ストリーム。
スクロールバッファから上下にスクロールするキーストロークが入力から削除されます。今後一連の文字に変換され、このストリームに配置されます。を使用して注入する方法はありませんTIOCSTI
。 POSIX 端末 I/O モデルに関する限り、完全に処理されました。地元の端末内ではホストには表示されません。 (ターミナルが実際の端末ではなく、実際にホストカーネルで実行されているエミュレータプログラムであるという事実はこれを変えません。)
KVTにキーストロークを挿入するには、デバイスを使用してuinput
必要なevdev入力イベントを生成します。 KVTの場合、evdev入力イベントは概念的に(エミュレートされた)端末自体の内部にあり、ホストに送信される前に端末内でローカルに処理されます。