追加読書

追加読書

ここにある回答の助けを借りて、以下のスクリプトを使用して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

キーストロークを送信しません。

不要なTIOCSTII / Oコントロールは、端末デバイスの入力ストリームに文字を挿入します。この流れが結果です後ろにキーストロークが一連の文字に変換されました。端末から入力を読み取るアプリケーションに表示される(生)文字ストリーム。

スクロールバッファから上下にスクロールするキーストロークが入力から削除されます。今後一連の文字に変換され、このストリームに配置されます。を使用して注入する方法はありませんTIOCSTI。 POSIX 端末 I/O モデルに関する限り、完全に処理されました。地元の端末内ではホストには表示されません。 (ターミナルが実際の端末ではなく、実際にホストカーネルで実行されているエミュレータプログラムであるという事実はこれを変えません。)

KVTにキーストロークを挿入するには、デバイスを使用してuinput必要なevdev入力イベントを生成します。 KVTの場合、evdev入力イベントは概念的に(エミュレートされた)端末自体の内部にあり、ホストに送信される前に端末内でローカルに処理されます。

追加読書

関連情報