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

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

터미널 에뮬레이터의 길이와 너비를 보면 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의 "터미널 표시" 모두 서로 다른 줄 길이와 줄 수를 표시합니다. SSH 및 텔넷을 통해 터미널 길이와 너비는 어떻게 전달됩니까?

답변1

텔넷 프로토콜에 설명되어 있음RFC 854, 대역 내 명령을 보내는 방법 포함IAC 캐릭터, '\255', 그 뒤에 몇 바이트가 옵니다. 이러한 명령은 원격으로 인터럽트를 보내는 것과 같은 작업을 수행할 수 있지만 일반적으로 인터럽트를 보내는 데 사용됩니다.옵션.

전송된 교환 세부정보 보기터미널 유형옵션은 다음에서 찾을 수 있습니다.마이크로소프트 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

답변2

나는 그것이 신호를 통한 것이라고 생각합니다 SIGWINCH. 아마도 파이프되었을 것입니다.

~에서위키피디아:

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

내가 그렇게 한다면(에서 zsh):

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

...단말기 크기를 수정했습니다.

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

답변3

RFC 4254 섹션 6.9 메시지 이름 "window-change"가 새 크기로 전송됩니다. 클라이언트 측에서는 원본 SIGWINCH가 실제로 포착될 수 있지만 메시지와 함께 전송된다고 생각합니다. https://www.ietf.org/rfc/rfc4254.txt

관련 정보