rcmdnk's blog

20180202_terminfo_200_200

GNU screenを立ち上げると通常TERM=screen.xterm-256colorの様な screenの入った名前のterminfoが設定されます。

この状態でsshするとssh先のサーバーでもこのTERMの値が引き継がれますが このterminfoがない場合があり Vim等を立ち上げるとエラーが出ることがあります。

そのようなときの対処法について。

Sponsored Links

問題

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を使うとこの様な自体を上手く避けれます。

まず、.bashrcsshsshrcにaliasしてしまいます。

.bashrc
1
alias ssh="sshrc"

次に、.sshrc

.sshrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set_term () {
  if [[ "$TERM" =~ screen ]]; then
    _terms=(screen.xterm-256color screen-256color xterm-256color screen-16color screen xterm-16color xterm)
  else
    _terms=(xterm-256color xterm-16color xterm)
  fi
  for t in "${_terms[@]}";do
    if infocmp >&/dev/null;then
      break
    else
      export TERM=$t
    fi
  done
}
set_term
alias ssh="sshrc"

こんな感じの設定を書きます。 リストしてあるterminfoは必要なら変更してください。

この設定によってsshした時、Bashを立ち上げる時に TERMをチェックして存在していないterminfoなら他のterminfoに変更する様に出来ます。 (最後はxtermで打ち止めですが、流石にこれは殆どの環境にあると思います。無いような環境でも使うなら適当に追加してください。)

sshした先のサーバーでもsshsshrcをaliasするので、 さらに他のサーバーに行く場合でもまたTERMをチェックしてくれる様になります。

Sponsored Links
Sponsored Links

« Google Chrome上でマウスカーソルが消えてしまう場合の対処法 VimのプラグインUnite.vimからdenite.nvimへの移行 »