在此处找到的答案的帮助下,我能够使用下面的脚本将击键发送到 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,它会运行 shell 历史记录中的最后一个命令。
echo -e '\e[A' | sudo /tmp/stdin2keyboard-buffer
现在我真正想做的是将 Shift+PgUp 发送到控制台,这样我也可以看到 VGA 控制台的向后滚动,但我似乎无法弄清楚 Shift PgUp 的转义序列。
另一种方法是弄清楚如何转储 /dev/vcsa 的完整缓冲区,但设备驱动程序不支持该操作,或者我还没有弄清楚如何操作。无论如何,setterm 二进制文件都不支持它。
答案1
您没有发送击键。
不受欢迎的TIOCSTI
I/O 控件将字符插入终端设备的输入流中。这个流就是结果后击键已转变为字符序列。它是从终端读取输入的应用程序看到的(原始)字符流。
在滚动缓冲区中上下滚动的按键被从输入中去除前被转换成字符序列并放入此流中。没有办法使用 来注入它们TIOCSTI
。就 POSIX 终端 I/O 模型而言,它们是完全处理的本地在终端内,并且主机永远不会看到。 (终端不是真正的终端,而是实际上是在主机内核中运行的模拟器程序,这一事实不会改变这一点。)
要将击键注入 KVT,请使用设备uinput
生成必要的 evdev 输入事件。对于 KVT,evdev 输入事件在概念上是(模拟)终端本身的内部事件,并且在发送到主机之前要经过终端内的任何本地处理。