/var/iot/data
にリモートでデータを取得しようとしているデバイスがあります。
マシン自体:
# cat /var/iot/data | xxd -ps -c 32
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
それは正しいデータです。
同じことをリモートで実行すると、正しく見えます。
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32'
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
しかし、実際には一連のエスケープシーケンスが発生しています。
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32' | xxd
00000000: 1b5d 3131 3b23 3138 3464 3666 0738 3064 .]11;#184d6f.80d
00000010: 6530 3034 6130 3330 3237 3030 3535 3637 e004a03027005567
00000020: 3830 3133 6163 3539 3165 3563 3661 6261 8013ac591e5c6aba
00000030: 6332 3138 3566 3433 3139 6338 3038 3865 c2185f4319c8088e
00000040: 330a 1b5d 3131 3b23 3139 3139 3730 07 3..]11;#191970.
初めの.]11;#184d6f.
は何ですか?
シーケンスは
OSC 1 1 ; # 1 8 4 d 6 f BEL
OSC 1 1 ; # 1 9 1 9 7 0 BEL
これは xterm制御シーケンス であり、端末テキストの背景色の設定を要求します。おそらく、シェルのプロンプトからコマンドの出力を区別するためにこれらが出力される原因となる、不適切に記述されたシェル初期化ファイルによって引き起こされますが、無条件にそうします
初期化ファイル に関するbashの奇妙な振る舞いに噛まれている可能性があります。 Bashは、2つの完全に異なるケースで.bashrc
をロードします。
sshd
によって生成された非対話型シェルの場合。したがって、SSH経由でログインすると、bashは、シェルがインタラクティブである場合は.bash_profile
を、そうでない場合は.bashrc
をロードします。 -T
をssh
に渡しても影響はありません。また、SSHがターミナルを作成するのは、コマンドを渡さない場合、または-t
をssh
。
.bashrc
には、いくつかのエスケープシーケンス(具体的には 背景色を設定するため )を発行することによって端末がやり取りするコードが含まれているようです。これにより混乱が生じるのを避けるために、bashがインタラクティブに実行されていない場合は、.bashrc
から何も実行しないでください。 これを.bashrc
の上部に配置 :
if [[ $- != *i* ]]; then return; fi
私はsshする前に端末の背景を設定するssh
という関数を持っているので、どの端末がリモートであるかを常に知ることができます。みんなの時間を無駄にしてすみません。