추가 읽기

추가 읽기

여기에 있는 답변의 도움으로 아래 스크립트를 사용하여 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

키 입력을 보내지 않습니다.

원하지 않는 TIOCSTII/O 컨트롤은 터미널 장치의 입력 스트림에 문자를 삽입합니다. 이런 흐름이 결과다뒤쪽에키 입력이 일련의 문자로 변환되었습니다. 터미널에서 입력을 읽는 애플리케이션에 표시되는 (원시) 문자 스트림입니다.

스크롤 버퍼에서 위아래로 스크롤하는 키 입력이 입력에서 제거됩니다.앞으로일련의 문자로 변환되어 이 스트림에 배치됩니다. 를 사용하여 주입할 수 있는 방법은 없습니다 TIOCSTI. POSIX 터미널 I/O 모델에 관한 한 완전히 처리되었습니다.현지의터미널 내에서는 호스트에서는 볼 수 없습니다. (터미널이 실제 터미널이 아니라 실제로 호스트 커널에서 실행되는 에뮬레이터 프로그램이라는 사실은 이를 바꾸지 않습니다.)

KVT에 키 입력을 삽입하려면 장치를 사용하여 uinput필요한 evdev 입력 이벤트를 생성하세요. KVT의 경우 evdev 입력 이벤트는 개념적으로 (에뮬레이션된) 터미널 자체 내부에 있으며 호스트로 전송되기 전에 터미널 내에서 로컬 처리를 거칩니다.

추가 읽기

관련 정보