SSH와 텔넷을 통해 터미널 길이와 너비는 어떻게 전달됩니까?


15

터미널 에뮬레이터의 길이와 너비를 볼 때 길이 stty size는 271 자, 키는 71 줄입니다. SSH를 통해 다른 서버에 로그인하고 실행 stty size하면 길이가 271 자이고 키가 71 줄입니다. 일부 Cisco IOS 장치에 로그인 할 수 있으며 터미널의 길이는 여전히 271 자, 키는 71 줄입니다.

C1841#show terminal | i Len|Wid
Length: 71 lines, Width: 271 columns
C1841#

이제 로컬 컴퓨터에서 터미널 에뮬레이터 (Gnome terminal) 창의 크기를 조정하면 stty size원격 서버와 IOS의 "show terminal"에서 서로 다른 줄 길이와 줄 수가 표시됩니다. SSH와 텔넷을 통해 터미널 길이와 너비는 어떻게 전달됩니까?

답변:


20

에서 설명하는 텔넷 프로토콜, RFC 854 의 구성, 대역 명령을 보낼 수있는 방법을 포함 IAC 문자 , '\255'몇 가지 더 바이트 하였다. 이러한 명령은 원격으로 인터럽트를 보내는 것과 같은 작업을 수행 할 수 있지만 일반적으로 옵션 을 보내는 데 사용됩니다 .

터미널 유형 옵션 을 전송하는 교환에 대한 자세한 내용 은 Microsoft Q231866에 나와 있습니다.

창 크기 옵션에 설명되어 RFC 1073 . 클라이언트는 먼저 NAWS옵션 을 보내려는 의지를 보냅니다 . 서버가 응답 DO NAWS하면 클라이언트는 NAWS두 개의 16 비트 값으로 구성된 옵션 데이터 를 보낼 수 있습니다 .

47 행 80 열 터미널의 세션 예 :

telnet> set options
Will show option processing.
telnet> open localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SENT WILL NAWS
RCVD DO NAWS
SENT IAC SB NAWS 0 80 (80) 0 47 (47)

ssh 프로토콜은 RFC 4254에 설명되어 있습니다. 메시지 스트림으로 구성됩니다. 그러한 메시지 중 하나 "pty-req"는 의사 터미널을 요청하는 것이며, 그 매개 변수에는 터미널 높이와 너비가 포함됩니다.

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "pty-req"
boolean   want_reply
string    TERM environment variable value (e.g., vt100)
uint32    terminal width, characters (e.g., 80)
uint32    terminal height, rows (e.g., 24)
uint32    terminal width, pixels (e.g., 640)
uint32    terminal height, pixels (e.g., 480)
string    encoded terminal modes

텔넷 및 ssh 클라이언트는 SIGWINCH신호 를 포착 하므로 세션 중에 터미널 창의 크기를 조정하면 새로운 크기의 서버에 적절한 메시지가 전송됩니다. Ssh는 창 차원 변경 메시지를 보냅니다.

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "window-change"
boolean   FALSE
uint32    terminal width, columns
uint32    terminal height, rows
uint32    terminal width, pixels
uint32    terminal height, pixels

실제로 Window Dimension Change Message?를 보내는 데 사용할 수있는 16 진수 값의 예를 사용하여 업데이트 할 수 있습니까? 어디에서나 그 예를 찾을 수 없습니다.
MirroredFate

@MirroredFate 해당 메시지를 보내는 C 코드는 github.com/openssh/openssh-portable/blob/master/… 입니다. 나는 전송 된 원시 바이트를 보는 방법을 모릅니다. openssh 소스 코드에 로깅을 추가해야 할 수도 있습니다.
Mark Plotnick

2

나는 그것이 신호를 통한 것으로 의심 SIGWINCH됩니다 --- 아마도 파이프 아래로 전달되었을 것입니다.

에서 위키 피 디아 :

SIGWINCH
    The SIGWINCH signal is sent to a process when its controlling
     terminal changes its size (a window change).

내가 (in zsh)하면 :

[romano:~] 1 % TRAPWINCH() {echo hi;}

... 그리고 터미널 크기를 수정합니다.

[romano:~] % stty size
35 99
[romano:~] % hi
[romano:~] % hi
[romano:~] % hi
[romano:~] % stty size
31 80

0

RFC 4254 섹션 6.9 "창 변경"메시지 이름이 새로운 차원으로 전송됩니다. 클라이언트 측에서는 원래 SIGWINCH가 잡히는 것이 사실이지만, 내가 믿는 메시지를 통해 전송됩니다. https://www.ietf.org/rfc/rfc4254.txt

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.