SSH는 어떻게 항상 터미널 속성을 재설정합니까?

SSH는 어떻게 항상 터미널 속성을 재설정합니까?

내가 달리면

strace -e trace=ioctl -v ssh some_remote_host

나는 다음 줄을 본다:

ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x6006, c_oflags=0x4, c_cflags=0x
4bf, c_lflags=0xa00, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x
15\x04\x00\x01\xff\x11\x13\x1a\xff\x12\x0f\x17\x16\xff\x00\x00"}) = 0

이는 의미가 있습니다. ssh다음과 같이 많은 터미널 설정을 변경해야 합니다.

  • ^C 및 ^Z는 로컬로 실행 중인 프로세스 ISIG가 아닌 원격 호스트의 프로세스를 중단하고 일시 중단해야 하기 때문에 종료됩니다 .ssh
  • ICANON라인 버퍼링 대신 버퍼링되지 않은 키보드 입력을 받기를 원하기 때문에 꺼져 있습니다 .
  • ECHO에코 발생 여부는 로컬 터미널에서 자동으로 발생하는 것이 아니라 원격 호스트의 의사 터미널에 설정된 속성에 따라 달라져야 하기 때문에 꺼져 있습니다.

ssh이제 세션을 종료하면 두 번째 호출을 통해 원래 터미널 속성을 복원합니다 ioctl.

ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x6d02, c_oflags=0x5, c_cflags=0x
4bf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\xff\x11\x13\x
1a\xff\x12\x0f\x17\x16\xff\x00\x00"}) = 0

그러나 내가 이상하게 생각하는 점은 두 번째 것을 만들 기회가 있기 전에 그것이 ssh죽 더라도 원래 터미널 속성이 복원된다는 것입니다. 그렇지 않으면 몇 가지 사항이 매우 잘못되었음을 알 수 있습니다(예를 들어, 쉘에 입력된 명령은SIGKILLioctl아니요대답하다). ssh더 이상 호출이 없더라도 원래 단말기 속성이 복원되었는지 어떻게 확인할 수 있습니까 ioctl?

답변1

쉘은 터미널이 ssh작동하지 않는다는 것을 알고 터미널을 재설정할 수 있습니다.

자식을 죽일 때 bash 쉘을 추적해 보면 sshioctl() 호출이 여러 번 발생하는 것으로 나타났습니다.

--- SIGCHLD (Child exited) @ 0 (0) ---
ioctl(255, TIOCSPGRP, [52631])          = 0
ioctl(0, TIOCGWINSZ, {ws_row=25, ws_col=147, ws_xpixel=902, ws_ypixel=329}) = 0
ioctl(0, TIOCSWINSZ, {ws_row=25, ws_col=147, ws_xpixel=902, ws_ypixel=329}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {c_iflags=0x500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x400, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a31, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x00\x00\x00\x00"}) = 0

관련 정보