SSHクライアントがTERM環境変数をサーバーに渡さないようにしますか?


20

私は現在、Fedora 18 gnome-terminalを使用していて、そのtmux中でマルチプレクサーを起動しました。コマンドを介してCentOS 5サーバーに接続した後ssh、私は見つけます:

  • ls 結果には色がありません
  • tmuxscreenhexedithtopすべては次のようにエラーメッセージが表示されて起動に失敗しました:
    ターミナルのオープンに失敗しました:ターミナルが見つからないか不適切です:screen-256color

ssh$ TERM環境変数をサーバーに渡すようですが、/etc/ssh/ssh_configFedora 18のファイルで見つけることができません。

サーバー上の$ TERM変数を手動で変更できますが、接続するたびに再び発生します。それを防ぐ方法は?

回答:


17

$TERM どの端末と通信しているかをアプリケーションに伝えて、どの端末と通信するかを知ってもらうことです。

リモートホストでサポートされている値に変更し、端末(screen)にできる限り一致します。

ほとんどのLinuxシステムには、少なくともscreenterminfoエントリが必要です。ない場合は、screenのスーパーセットを実装vt100し、vt100普遍的です。そう:

TERM=screen ssh host

または

TERM=vt100 ssh host

256色のサポートが必要な場合は、xterm-256colorどれが近いか(screen同じように256色をサポートします)を試してxterm、端末アプリケーションが256色をサポートしているアプリケーションにその使用方法を伝えることができます。

または、リモートホストにterminfoエントリをインストールできます。

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'

2
知っておくinfocmpと便利です。tic一度コンパイルすれば、一時的に$TERM再度変更する必要はありません。ところで、/usr/share/terminfo/s/screen-256colorFedora 18からCentOSにコピー(rsync)しただけで、うまくいくようです(rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s)。
LiuYan刘研

言及するのを忘れて、私tmuxはFedora 18のgnome-terminalで走り、値をfrom にtmux変更$TERMscreen-256colorましたxterm-256color
LiuYan刘研

ところで、sshはこのように機能しますか?ホスト/サーバーがサポートしている(プッシュされていない)terminfoを取得し、クライアント端末がサポートできるものをピックアップしますか?
LiuYan刘研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'に短縮できますinfocmp | ssh root@remote-host "tic -"。これは、パイプを使用しているときにファイルとしてアクセスできるため、うまく機能します。幸運なことに、パイプはSSHで機能します。
アランジェンキンス

1
@starfry、tic(terminfoコンパイラ)で生成されたファイルのバイナリ形式がシステム間で同じであること、またはそれらの場所が同じであることを保証することはできません。tic権限が正しいことを確認したり、必要に応じて中間ディレクトリを作成したりすることもできます。
ステファンシャゼラス16

10

私の場合、ローカルデスクトップ上の.zshrc.bashrcbashを使用している場合)にエイリアスを追加しました。

alias ssh='TERM=xterm ssh'

すでにエイリアスを使用している場合は、環境の割り当てが含まれるように調整します。


1

私はこれを.bashrcリモートホスト上に置きます:

# 256-color mode not supported on this host
if echo $TERM | grep -q -- '-256color'; then
    echo -e '\n\n256-color mode not supported on this host.  Reverting TERM...\n'
    export TERM=`echo -n $TERM | sed 's/-256color//'`
fi

その方法は、両方xterm-256colorscreen-265color適切に処理されています。また、サーバーを後でアップグレードして256色をサポートする場合、SSHするときにTERM変数が変更される理由を疑問に思って壁にぶつからないように、ノートを出力します。


:または、サブシェルや別のプロセスを開始していないexport TERM=${TERM%%-256color}
miken32

1

変更$TERMはうまくいくかもしれませんが、私はこれを提案しません、それは解決策ではなく単なる回避策です。

システムでこの問題が発生した場合、最も一般的な端末タイプのサポートをリモートシステムにインストールすることで修正します。

  • yum install ncurses-basescreen-256colorCentOS 向け
  • yum install ncurses-termscreen-256color-bceCentOS 向け
  • apt install ncurses-baseDebian、Ubuntu、Mintの両方screen-256colorscreen-256color-bce

ncurses関連のパッケージは、他の多くの端末のサポートも提供し、他のすべての大規模なディストリビューションでも利用可能です。(しかし、私のユースケースとあなたの質問のために、これは十分な情報でなければなりません)


0

man ssh_configを参照してください:

 SendEnv
         Specifies what variables from the local environ(7) should be sent
         to the server.  Note that environment passing is only supported
         for protocol 2.  The server must also support it, and the server
         must be configured to accept these environment variables.  Refer
         to AcceptEnv in sshd_config(5) for how to configure the server.
         Variables are specified by name, which may contain wildcard char‐
         acters.  Multiple environment variables may be separated by
         whitespace or spread across multiple SendEnv directives. The
         default is not to send any environment variables.

and sshd_config:

 AcceptEnv
         Specifies what environment variables sent by the client will be
         copied into the session's environ(7).  See SendEnv in
         ssh_config(5) for how to configure the client.  Note that envi-
         ronment passing is only supported for protocol 2.  Variables are
         specified by name, which may contain the wildcard characters `*'
         and `?'.  Multiple environment variables may be separated by
         whitespace or spread across multiple AcceptEnv directives.  Be
         warned that some environment variables could be used to bypass
         restricted user environments.  For this reason, care should be
         taken in the use of this directive.  The default is not to accept
         any environment variables.

それによると、デフォルトでは変数を送信しないはずですが、TERMは特別なようです。とにかく送信されます。

したがってTERM=xterm ssh ...、sshを呼び出すときにTERMを変更する(など)、ログイン後に変更する(など.bash_profile)か、サーバー側で不明なTERMタイプを定義することができます(そこにrootアクセスがあると仮定)。詳細については、他の回答を参照してください。


1
設定しないと$TERM実際にもサポートされていない値に設定するよりも良くなりません。
ステファンシャゼル

文字通りの質問は、TERMの送信を防ぐ方法でした。-回答:できません。-彼がすべきことは、適切な値に設定することです。
-michas

$TERM一時的な変更は回避策かもしれませんが、毎回変更する必要があります。ところで、それはCentOSの両方の5とFedora 18受け入れているようだのEnvをすべてのロケール環境変数(LANGLC_*、...)
LiuYan刘研
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.