화면/개발자/pts/가상 머신의 stty 설정이 올바르지 않습니다.

화면/개발자/pts/가상 머신의 stty 설정이 올바르지 않습니다.

의사 터미널(임의의 터미널)을 통해 사용할 수 있는 직렬 포트를 터미널에 제공하기 위해 가상 머신(linux+kvm+qemu 사용)을 설정합니다./dev/pts/<number>

화면은 이스케이프 문자(예: )를 올바르게 처리하지 않거나 입력을 여러 번 에코하는 방법 /dev/pts/<number>보다 더 나은 것으로 밝혀졌기 때문에 상호 작용하는 방법으로 화면을 사용합니다 .cat /dev/pts/<number> & cat > /dev/pts/<number>ctrl-c

stty --all이 문제의 문제이자 핵심은 셸에서 내부적으로 쿼리한 "tty/pts"에 대한 설정에 차원( 및 ) screen /dev/pts/<number>에 대한 올바른 설정이 없다는 것입니다 . 이는 실제로 내부적으로 잘못된 줄 바꿈 등으로 인해 골치 아픈 일을 일으킬 수 있습니다. VM의 셸입니다.colsrows

여기서는 둘 이상의 시스템과 터미널 /tty/pts가 실행 중이므로 올바른 설정을 구성하는 방법을 알 수 있는 경험이 충분하지 않습니다.

screen /dev/pts/<number>쉘에 올바른 설정을 알리려면 어떻게 해야 합니까 stty?

** 갱신**

stty --all가상 머신 셸 내부의 출력은 다음과 같습니다.

root@mail:~# stty --all
speed 115200 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

stty --all호스트 시스템 셸의 출력은 다음과 같습니다.

speed 38400 baud; rows 39; columns 147; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

답변1

대화형 셸 초기화를 실행하도록 설정한 경우resize, 터미널의 크기를 묻고 동일한 시스템 호출을 수행합니다 stty.

블록이 a의 끝에 있습니다..bashrc작동합니다:

if [ -t 0 ] && [ -t 1 ] && [[ $TERM == screen* ]] && [ -f /usr/bin/resize ];
  크기 조정>/dev/null
  # stty-a
필리핀 제도

표준 입력/출력이 터미널인지(즉, 세션이 대화형인지) TERM다음 중 하나로 설정되어 있는지 확인합니다.screen플레이버 및 resize설치 여부.

출력을 리디렉션해도 resize터미널에 이스케이프 시퀀스를 보내고 응답을 받는 데 방해가 되지 않습니다.열려 있는이를 위해 tty에 대한 자체 스트림이 있습니다.

추가 자료:

답변2

너무 길어요 박사님;직렬 연결 뒤의 내부 터미널이 터미널 에뮬레이터의 크기 설정을 수신하려면 이를./bashrc

set_terminal_dimension() (
  old="$(stty -g)"
  stty raw -echo min 0 time 1
  printf '\033[18t' >/dev/tty
  IFS=';t' read -r _ rows cols _ </dev/tty
  stty "$old";
  stty cols "$cols" rows "$rows"
)
PROMPT_COMMAND='set_terminal_dimension'

배경 세부정보

Linux 시스템에 대한 연결 중 하나 serial connection(예: /dev/ttyS0)는 입력 및 출력을 위한 바이트 데이터 스트림을 제공합니다. 그러나 IPC(신호와 같은 프로세스 간 통신 방법)는 제공하지 않습니다. 그러므로 존재하지 않는다시그널 윈치이는 다음을 수행합니다.

SIGWINCH 신호는 제어 터미널이 크기를 변경할 때(창 변경) 프로세스로 전송됩니다.

물론 직렬 연결에서 수신된 출력을 표시하는 다른 컴퓨터는 stty동일한 컴퓨터가 아니기 때문에 터미널 설정(예: 을 통해)을 실행할 수 없습니다.

두 시스템 사이: a) TARGET-Sys는 직렬 연결 뒤에 쉘을 제공합니다. b) CONNECTING-Sys는 직렬 연결을 통해 TARGET 시스템을 읽고 씁니다. 문제는 다음과 같습니다.

시스템 "a) TARGET"은 셸을 실행 중이며 연결에 대한 올바른 정보를 설정해야 합니다(즉, 명령줄 유틸리티를 통해 설정할 수 있음 stty). 화면에 표시될 수 있는 문자 수의 크기를 알 수 있는 방법이 없습니다( cols그리고 rows"b)연결된" 시스템, 보다 정확하게는 해당 터미널 에뮬레이터 응용 프로그램만이 이를 알고 있습니다.

시스템 a)와 b)는 2개의 바이트 스트림 i) 입력과 ii) 출력을 통해 연결되며, 동일한 스트림을 통한 정보 교환 이 필요하며 주로 "a) 대상으로 전송된 키보드 입력과 "a) 대상 cols" 에서 수신된 출력에서 ​​볼 수 있습니다. rows체계. 분명히 이러한 정보 교환은 전송된 일반 바이트와 충돌할 수 있으므로 이스케이프 바이트 시퀀스를 사용하여 정보를 구체적으로 표시하려는 시도가 있는 경우 프로토콜을 사용할 수 있습니다. 이 글에서 설명했듯이답변직렬 통신은 SSH 연결(두 시스템도 연결함)의 반대이며 NAWS와 같은 특수 프로토콜을 사용하여 설정되지 않습니다."SSH 및 텔넷을 통해 터미널 길이와 너비가 어떻게 전달됩니까?"에 대한 답변).

resize여기에 대한 또 다른 대답은 일반적으로 배포판에 패키지로 제공되는 기성 프로그램을 사용하는 것입니다. 이 답변은 "단순함으로 인해 패키지 종속성이 줄어듭니다." -GUI를 통해 직렬 통신을 사용하는 많은 시스템(예: 서버) Xorg에서 기대할 수 있는 태도

Archlinux Wiki의 "직렬 콘솔 사용"에서"문제 해결 섹션"또한 resize많은 배포판 패키지에 포함된 명령을 언급하십시오 xterm. 직렬 연결을 사용하는 것은 일반적으로 직렬 연결을 통해 연결된 시스템에서 그래픽 출력/GUI를 요구하지 않는 것과 일치하므로 이 xterm솔루션은 다소 큰 솔루션일 수 있습니다(Xorg 서버를 패키지 종속성으로 제공).

따라서 터미널의 크기에 관해서는 여기에 명시되어 있습니다.

  1. xterm을 설치하지 않으려면 쉘 기능을 통해 동일한 작업을 수행할 수 있습니다. zshrc에 다음 함수를 배치하고 터미널 에뮬레이터 창의 크기를 조정한 후 인수 없이 호출합니다.

여기에 설명된 솔루션은 터미널이 상대방 터미널 에뮬레이터로부터 응답을 요청하고 수신하는 방법도 자세히 설명합니다. 보다 가벼운 솔루션은 다음 bash 스크립트와 유사할 수 있습니다 /bin/sbin/resize.sh.

#!/bin/bash

## store tty settings before
old="$(stty -g)"

## briefly disable any stty setting, like echo or line discipline
## because for a brief moment a escape sequence is send (to be received
## by the receiver (a terminal emulator program)
## a) raw => no line discipline
## b) -echo => disable repeating and display stuff 
## c) min 0 time 1 => return a read with after 1 tenth of a sec and no minimum bytes 
stty raw -echo min 0 time 1

## send the request an escape sequence for the outer terminal emulator
printf '\033[18t' >/dev/tty

## use read shell builtin to read the return into the variables rows, cols
## (IFS is used in combination with a "_" (as "garbage variable") to 
##  get rid of not neede part of response)
IFS=';t' read -r _ rows cols _ </dev/tty

## (previous settings are restore, ie. the "raw" and "-echo" is undone)
stty "$old";

## finally the received info ( the info provided via the same stream
## of bits as bytes as also actually incoming the bytes generated by the 
## keyboard ) and which was read into the variables was set before
stty cols "$cols" rows "$rows"

관련 정보