GNU screenを立ち上げると通常TERM=screen.xterm-256color
の様な
screen
の入った名前のterminfoが設定されます。
この状態でssh
するとssh先のサーバーでもこのTERMの値が引き継がれますが
このterminfoがない場合があり
Vim等を立ち上げるとエラーが出ることがあります。
そのようなときの対処法について。
問題
GNU screenを立ち上げた後、その中からssh
で他のサーバーに行って
Vimとかを立ち上げようとすると、
$ vim
E558: Terminal entry not found in terminfo
'screen.xterm-256color' not known. Available builtin terminals are:
builtin_ansi
builtin_xterm
builtin_iris-ansi
builtin_dumb
defaulting to 'ansi'
みたいなエラーが出る問題。 一応このまま続けてVimで編集が出来ますがSyntaxハイライトとかは効かなかったりします。
問題はTERM=screen.xterm-256color
がsshで引き継がれるものの、
接続先サーバーにこのterminfoが無いことです。
とりあえずの解決法
とりあえずその場で
$ export TERM=xterm-256color
などそのサーバーにあるterminfoを指定してあげればこの様なエラーは出なくなります。
どの様なterminfoがあるかは
/usr/share/terminfo/*/*
など、TERMINFOのパスに指定されてるディレクトリにあるファイルを探します。
TERMINFO
と言う値が指定されてる場合はそのディレクトリ、そうでない場合は
man terminfo
すると
NAME
terminfo - terminal capability data base
SYNOPSIS
/usr/share/terminfo/*/*
みたいに書いてあるディレクトリが使われるディレクトリです。
もしくは
$ infocmp xterm-256color
# Reconstructed via infocmp from file: /usr/share/terminfo/78/xterm-256color
xterm-256color|xterm with 256 colors,
am, bce, ccc, km, mc5i, mir, msgr, npc, xenl,
colors#256, cols#80, it#8, lines#24, pairs#32767,
...
$ infocmp xterm-non
infocmp: couldn't open terminfo file (null).
$
の様にinfocmp
を使えばそのterminfoがあるかどうか分かります。
よく使うサーバーの場合
よく使うサーバーで毎回この様なことをするのはあれなので、 .bashrcなどに
export TERM=xterm-256color
とか書いておけば毎回設定せずに済みます。
手元で解決
GNU screenを立ち上げた時にTERMの値を他でも通常あるようなxterm-256color
などにしておくことも出来ます。
.screenrcに
term "xterm-256color"
と書いておけば立ち上げた後にTERM=xterm-256color
が設定されます。
ただ、色々な設定で
if [[ "$TERM" =~ screen ]]; then
...
みたいにscreen
内に居るのかどうかを判断して行う事が出来なくなって結構不便です。
その様な設定が全くなければ殆ど弊害はないと思いますが あまり良くない設定。
sshrcを使ってssh時にチェックする
よく使うサーバーであれば一回設定しておけば良いですが、 ふと初めて入ったサーバーでこの様な問題が起きるとちょっと嫌な気分になります。
sshrc
を使うとこの様な自体を上手く避けれます。
まず、.bashrcでssh
をsshrc
にaliasしてしまいます。
1
|
|
次に、.sshrc
に
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
こんな感じの設定を書きます。 リストしてあるterminfoは必要なら変更してください。
この設定によってssh
した時、Bashを立ち上げる時に
TERM
をチェックして存在していないterminfoなら他のterminfoに変更する様に出来ます。
(最後はxterm
で打ち止めですが、流石にこれは殆どの環境にあると思います。無いような環境でも使うなら適当に追加してください。)
sshした先のサーバーでもssh
にsshrc
をaliasするので、
さらに他のサーバーに行く場合でもまたTERM
をチェックしてくれる様になります。