내가 달리면
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
죽 더라도 원래 터미널 속성이 복원된다는 것입니다. 그렇지 않으면 몇 가지 사항이 매우 잘못되었음을 알 수 있습니다(예를 들어, 쉘에 입력된 명령은SIGKILL
ioctl
아니요대답하다). ssh
더 이상 호출이 없더라도 원래 단말기 속성이 복원되었는지 어떻게 확인할 수 있습니까 ioctl
?
답변1
쉘은 터미널이 ssh
작동하지 않는다는 것을 알고 터미널을 재설정할 수 있습니다.
자식을 죽일 때 bash 쉘을 추적해 보면 ssh
ioctl() 호출이 여러 번 발생하는 것으로 나타났습니다.
--- 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