web-dev-qa-db-ja.com

sshを介してファイルをcatすると制御文字になるのはなぜですか?

/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.は何ですか?

5
Greg Bell

シーケンスは

OSC 1 1 ; # 1 8 4 d 6 f BEL
OSC 1 1 ; # 1 9 1 9 7 0 BEL

これは xterm制御シーケンス であり、端末テキストの背景色の設定を要求します。おそらく、シェルのプロンプトからコマンドの出力を区別するためにこれらが出力される原因となる、不適切に記述されたシェル初期化ファイルによって引き起こされますが、無条件にそうします

11
icarus

初期化ファイル に関するbashの奇妙な振る舞いに噛まれている可能性があります。 Bashは、2つの完全に異なるケースで.bashrcをロードします。

したがって、SSH経由でログインすると、bashは、シェルがインタラクティブである場合は.bash_profileを、そうでない場合は.bashrcをロードします。 -Tsshに渡しても影響はありません。また、SSHがターミナルを作成するのは、コマンドを渡さない場合、または-tssh

.bashrcには、いくつかのエスケープシーケンス(具体的には 背景色を設定するため )を発行することによって端末がやり取りするコードが含まれているようです。これにより混乱が生じるのを避けるために、bashがインタラクティブに実行されていない場合は、.bashrcから何も実行しないでください。 これを.bashrcの上部に配置

if [[ $- != *i* ]]; then return; fi

私はsshする前に端末の背景を設定するsshという関数を持っているので、どの端末がリモートであるかを常に知ることができます。みんなの時間を無駄にしてすみません。

1
Greg Bell