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セッションを終了すると、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でも元の端末のプロパティが復元されることです。それ以外の場合、いくつかのことが非常に間違っていることがわかります(たとえば、シェルに入力されたコマンドは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

おすすめ記事