走れば
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
セッションを終了すると、2回目の呼び出しで元の端末プロパティが復元されます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
しかし、私が奇妙に思うのは、2番目のものを作る機会がある前に死ん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