GNU Screenの上でSSHすると文字入力が変になるサーバーがある

普段作業マシンで GNU Screen を使っていて、もちろん .screenrc は秘伝のタレ状態で、その状態で他人の用意したサーバーに SSH でアクセスしたときの話。
文字入力がなんか変で、バックスペースが効かなかったり、カーソルキーを押すと直前の文字が繰り返し入力されたりということがたまにあります。

なんでだろうと思っていたら、SSH セッションを閉じたときに、次のように表示されました。

'screen-256color-bce': unknown terminal type.

どうもサーバーさんにscreen-256color-bceという定義が見付からないらしいです。

screen-256color-bceというのは、screen を起動したときにTERMという環境変数に設定される値で、おそらく .screenrc の以下の設定項目から作られています。

~/.screenrc
defbce on
term screen-256color

なんでこんな設定をしたかというと、vim で 256 色表示を使いたかったからなのですが、一時的に作業する他人のマシンでまでこの設定を維持する必要は無いので、ログインしたらすぐに

$ TERM=xterm

と入力すればTERMの値が変更されて、文字入力も希望している通りに認識されるようになります。

サーバーによってはxterm-256colorだったら受け入れてくれたりするので、

$ TERM=xterm-256color

も試してみる価値あるかも。

一度しかアクセスしないサーバーならこれでもいいけど、何度もこれやるのは面倒だなあと思ったら、SSH コマンドを打つときにTERMを指定する方法もあります。

$ TERM=xterm-256color ssh user@hostname -p 2222

相手のサーバーでTERMの値がscreen-256color-bceになってる理由は、まず screen が screen を実行したマシンのシェルの環境変数TERMを設定していて、これが SSH によってサーバーに渡されて、サーバー側のシェルの環境変数に設定されているので、SSH で繋ぐ直前にTERMの値を変えてしまおうというわけです。
コマンドを実行するときに代入した変数の値は、そのコマンドが終了すると破棄されるので、クライアント側のマシンには影響ありません。

この方法だったら、シェルの履歴からアクセスしたり、シェルスクリプト書いたり、エイリアス書いたりすれば入力が省略できますね。

他にも .screenrc をちゃんとする方法とか、~/.ssh/config を使った設定方法とかもありそうだけど、今回はここまで。

コメントを残す