OpenSSH、アプリケーションを閉じるときにFreeBSD画面が上書きされる


3

VMに新しいFreeBSD 10をインストールし、SSH経由で接続しました。プログラム(たとえば、htop、top、nanoなど)を閉じると、セッションの内容が上書きされることに気付きました。

ターミナルのスクリーンショット

Ubuntu、たとえばDebianサーバーに接続するとき、これは起こりません。

これが何と呼ばれているのかよく分からないので、Googleは助けにはなりません。

誰もこれを経験したことがありますか?/変更する必要があるOpenSSHサーバーの設定はありますか?

回答:


4

セッションの内容は、最初にTUIプログラムを起動したときにすでに上書きされています。それが事実であることがわかります。

ncursesテキストユーザーインターフェイスを使用するなどのTUIプログラムが起動すると、画面がクリアされます。その時点で、画面上のすべてのものが上書きされています。

不足しているもの、および名前がわからないものは、代替画面バッファーを持つ端末のアイデアです。これらのTUIプログラムが起動すると、エスケープシーケンスを発行して、端末の代替画面バッファー(存在する場合)に切り替えます。その出力はすべて、そのバッファーに送られます。プログラムが終了または一時停止すると、エスケープシーケンスを発行してプライマリスクリーンバッファーを復元します。これは、TUIプログラムがユーザーインターフェースを代替バッファーに表示している間はそのまま残ります。

代替画面バッファを持たない端末の場合、発行するエスケープシーケンスはありません。また、全画面のユーザーインターフェイスは、以前に端末にあったものを上書きします。

プログラムは、これらのエスケープシーケンスをデータベースterminfoまたはtermcapデータベースで検索します。ではterminfo、世界の端末能力が命名されているsmcuprmcup。ではtermcap、世界彼らが命名されているtite。文書化されているように、画面バッファについては何も言及していません。

代わりに、「カーソルアドレッシングモード」の開始と終了について話します。概念は、このようなフルスクリーンインターフェイスを表示するTUIプログラムは、カーソルアドレッシングモード動作しており、プログラムが実際に端末をスクロールする必要がないことです。一方、テキストのスクロール行を出力するだけのTUIプログラムはそうではありません。そのため、このモードに切り替えます。(現実の世界では、物事はそれほど明確ではありません。たとえば、Zシェルなどの最新のシェルは、行編集、メニュー補完、お​​よび$RPROMPT;のためにカーソルを移動しますが、代替画面バッファーに切り替えないでください。本格的なフルスクリーンユーザーインターフェースを備えており、スクロールの観点から操作できます。)

したがって、通常、機能は単にバッファーを切り替えるだけではありません。 smcupまた、現在のカーソル位置を保存するrmcupためのエスケープシーケンスと、端末にそのようなエスケープシーケンスがある場合、それを復元するためのエスケープシーケンスも含まれています。

あなたの問題は次の2つのうちの1つです。

  • エントリが不完全であるため、termcapFreeBSDシステムのデータベースには特定の端末タイプのエントリがteありませんti
  • そもそも、端末エミュレータに適切な端末タイプを使用していません。

端末タイプは、サーバー側のTERM環境変数から取得されます。その値は、データベース内のエントリを示します。そのため、環境変数が、(ローカル)ターミナルエミュレーターの機能と一致する機能を持つエントリーを指定するようにしてください。およびを含む端末エミュレータに一致するエントリがない場合、そのようなエントリを追加する必要があります。termcapTERM/etc/termcaptite


彼のエミュレータはとをサポートしてtiおりte、彼のTERM環境変数は適切なエスケープコード/etc/termcapを設定するエントリを指定titeているようです。さまざまなアプリがこれらのコードを出力しており、彼は結果の画面バッファーの切り替えが気に入らない。だから、アドバイスは、エントリを選択することであるべき省略 tiとしますte。(既存のまたはオーバーライド)カスタムエントリが必要な場合は、代わりに編集/etc/termcap、彼はそれを置くことができる~/.termcapか、TERMCAP環境変数。
マイクブラウン

彼がtcshを使用していると仮定すると、これは無効にtiなりte、端末タイプが何であるかに関係なく:setenv TERMCAP ${TERM}:ti@:te@:tc=${TERM}
Mike Brown

あなたは質問の写真を見たことがなく、物事を逆に考えています。
JdeBP

確かに、スクリーンショットは重要であり、あなたは正しいです。ti/ なしの端末で操作するのに慣れているので混乱していたのでte、その機能を備えた端末に切り替えると、彼がやったのとまったく同じことを言います:「私のセッションは上書きされます」、つまり私のnano / less / vi / whateverセッションは消滅し、以前行っていたものに置き換えられました。スクリーンショットからは、彼が反対の状況について話していたことがわかります。
マイクブラウン

2

FreeBSDフォーラムのこの投稿で、何を変更すべきかの例を見つけました。この変更を行った後、マンページの表示またはファイルの編集中に画面に表示されていたものは消去され、コマンドと端末のみが端末に表示されます(bash)。現在機能しているのは、エディターまたはその他のプロセスでのさまざまなスクロール方法(「2本指スクロール」など)です。

実行中の私にとって見事に機能しているのFreeBSD 11.0-RELEASE-p9は、4番目の行(te&を定義ti)と前のバックスラッシュを、次の用語エイリアスに追加することです/usr/share/misc/termcap

xterm-256color|xterm alias 3:\
    :Co#256:pa#32767:\
    :AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new:\
    :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h::tc=xterm-xfree86:

私はmacOSから来ているのでTERM=xterm-256color、私の2にxterm-256color|xterm alias2884行目で上記を追加しました。あなたTERMとあなたのtermcapファイルの配置は異なるかもしれません。

次に、termcapを変更した後、次を使用してtermcapデータベースを再構築する必要があります。

cap_mkdb /usr/share/misc/termcap

(これを既存の回答へのコメントとして提供していましたが、50を超える評判はありませんでした。)


2

roensが指摘したように、FreeBSDはデフォルトのtermcapエントリであるxterm-256colorにte / ti定義を含めません。ただし、画面のクリアを必要とするユーザー向けのtermcapエントリには、これらの定義が含まれています:xterm-clear。

したがって、これを実現する簡単な方法は、TERM変数を設定することです。

export TERM=xterm-clear

非常に遅い答えですが、私が見た他の多くのソリューション(roensを含む)は必要以上に複雑です(エスケープコードでtermcapファイルを修正し、dbを再コンパイルすることを含むため、.termcapファイルを使用して)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.