여기에 있는 답변의 도움으로 아래 스크립트를 사용하여 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의 이스케이프 시퀀스를 알아낼 수 없는 것 같습니다.
또 다른 접근 방식은 /dev/vcsa의 전체 버퍼를 덤프하는 방법을 알아내는 것입니다. 하지만 장치 드라이버가 이를 지원하지 않거나 아직 방법을 알아내지 못했습니다. 어쨌든 setterm 바이너리는 이를 지원하지 않습니다.
답변1
키 입력을 보내지 않습니다.
원하지 않는 TIOCSTI
I/O 컨트롤은 터미널 장치의 입력 스트림에 문자를 삽입합니다. 이런 흐름이 결과다뒤쪽에키 입력이 일련의 문자로 변환되었습니다. 터미널에서 입력을 읽는 애플리케이션에 표시되는 (원시) 문자 스트림입니다.
스크롤 버퍼에서 위아래로 스크롤하는 키 입력이 입력에서 제거됩니다.앞으로일련의 문자로 변환되어 이 스트림에 배치됩니다. 를 사용하여 주입할 수 있는 방법은 없습니다 TIOCSTI
. POSIX 터미널 I/O 모델에 관한 한 완전히 처리되었습니다.현지의터미널 내에서는 호스트에서는 볼 수 없습니다. (터미널이 실제 터미널이 아니라 실제로 호스트 커널에서 실행되는 에뮬레이터 프로그램이라는 사실은 이를 바꾸지 않습니다.)
KVT에 키 입력을 삽입하려면 장치를 사용하여 uinput
필요한 evdev 입력 이벤트를 생성하세요. KVT의 경우 evdev 입력 이벤트는 개념적으로 (에뮬레이션된) 터미널 자체 내부에 있으며 호스트로 전송되기 전에 터미널 내에서 로컬 처리를 거칩니다.