web-dev-qa-db-ja.com

`〜/ .bash_logout`に` clear_console`が呼び出されるのはなぜですか?

tty1tty2で同じユーザーでログインし、tty1でXサーバーセッションを開始すると-tty2からログアウトするとすぐに、Xサーバーセッションtty1でクラッシュします。

これは既知のバグのようです:

バグレポートで読むことができるように、問題はclear_console~/.bash_logoutの呼び出しにあります。その行を削除すると、すべて正常に機能します。

私の質問:

何の変化もありませんでした。 (明らかに、Xサーバーがクラッシュしなくなったことは別として。)ログアウトすると、その行を削除しても、コンソールはクリアされます。では、そもそもclear_consoleへの呼び出しは何ですか?

2
finefoot

世界はあなたにあなたのスクリーンをきれいにすることを望んでいます。

私が https://unix.stackexchange.com/a/233855/5132 で言ったように、そして実際に間接的に参照されたメーリングリストの議論で☺…

Greg Wooledgeや他の人たちが発見したように、ログオフとその後のログオンの間に仮想端末をクリアしたくないというのは、潮流に逆らって非常に泳いでいます。 1970年代以降、ログオフ後に残る特権ユーザーまたはボスからの機密出力の存在は、Unices(および実際には他のタイムシェアリングリモートアクセスオペレーティングシステム)のセキュリティ問題であり、すべてを元に戻すには多大な労力が必要です。この問題を回避するために人々が投入したもの。あなたが観察したように、彼らはこれを行ういくつかの重複するメカニズムを導入しました。

  • 多くのシステムでは、シェルログアウトスクリプトに標準でclear_consoleコマンドがあります。 (これは、カーネル仮想端末#1で実行されているグラフィカルプログラムではうまく機能せず、仮想または実数の他の種類の端末では機能しないため、それ自体で問題があります。)

    このコマンドは削除する必要があります。

  • mingettyなどの仮想端末を対象としたgettyプログラムのデフォルトは、端末をクリアすることです。 (これはログオン前に行われます。つまり、TTYログインサービスが停止した場合でも端末出力は消去されないままになります。皮肉なことに、この機能はloginに配置したほうがよいでしょう。これは、PAMの必要性のおかげでまだ残っています。ログオフ時に実行されます。)

    これを無効にするには、--noclearオプションを展開する必要があります。 systemdオペレーティングシステムでは、これには、1つ以上のユニットファイルオーバーライドファイルの書き込み、ExecStart設定の変更、または単に[email protected]を自分で考案したローカルユニットファイルに向けることが含まれます。

  • systemdが提供する[email protected]テンプレートサービスユニットセットTTYVTDisallocate=yesは、systemdにカーネル仮想端末をクリアするように指示します。 (これも、名前に部分的に反映されているように、ユーザースペースの仮想端末でさえも、他の種類の端末では機能しません。)

    これも、オーバーライドまたは[email protected]が指す別のサービステンプレートを使用して削除する必要があります。

もちろん、それらは完全に重複しているわけではありません。 mingettyは、シリアルデバイスを介して接続された実際の端末には役立ちません。 clear_consoleは、奇妙なことに、Bourne Again Shellパッケージの一部であり、Korn、Z、Almquist、Fish、Watanabe、またはその他のシェルをユーザーアカウントのインタラクティブログインシェルとして使用しているユーザーによって呼び出されません。また、systemd TTYVTDisallocateメカニズムは、systemd以外のオペレーティングシステムには適用できません。

数年前のメーリングリストの議論で言ったように、console_clearは二重に不要です。 2011年以降、Linuxの組み込み端末エミュレーターはスクロールバックバッファーをクリアするためのED 3制御シーケンスをサポートしているため、これらの有害な副作用がある仮想端末の切り替えをいじくり回す必要はありません。数年前にnoshツールセットにconsole-clearコマンドを追加しました。これは、この制御シーケンスを発行します(したがって、Linuxの組み込みターミナルエミュレーターだけでなく、リモート接続でも使用できます)。 ncurses clearコマンドは、terminfoがそう言っている場合、関連する制御シーケンスを発行することも最近知っています。

そしてもちろん、console-terminal-emulatorは、標準で端末のハングアップ時に表示バッファーをクリアします。

参考文献

4
JdeBP

dlocateによると、clear_consoleは(Debian)bashパッケージの一部です。アップストリームbashソースの一部ではありません。 パッケージ変更ログ は、いつ/どこから来たのかを示します。

-MatthiasKlose Thu、2006年3月23日01:16:22 +0100 
 
 bash(3.1-3)不安定; urgency = low 
 
 ... 
 
 Ubuntuからのマージ:
 * clear_console:[.____を含むコンソールをクリアするための新しいヘルパープログラム。]スクロールバックバッファ。
 * /etc/skel/.bash_logout:再度インストールし、clear_consoleを使用します。
 Ubuntu#29405。終了:#331504。

参照されているバグレポートには、追加された理由が記載されています。

  • buntu#29405 、2006年1月「clear」は「exit」の前に実行されません

    F1-F6端末からログアウトすると、次のログイン画面が表示されても、既存のアクティビティの出力はすべて画面に残ります。新しいログインが表示される前に画面をクリアして、他のユーザーがプライベート出力を表示しないようにする必要があります。

  • Debian#331504 、2005年10月bash:デフォルトの/etc/skel/.bash_logout[.____を指定してください。]

    Bashが/ etc/skelにデフォルトの.bash_logoutを提供し、ユーザーがコンソールからログインするときにデフォルトで画面をクリーンアップするために使用できると便利です。これは一般的なリクエストであり、特にユーザーが他のユーザーを望まないマルチユーザー環境ではそうです。彼らが何に取り組んでいるかを見るために。

ちなみに、それはここでncursesと関連して言及されました:

前者は、1999年に xtermパッチ#107 の機能を適応させることで解決されました(Linuxコンソール用) )、後者はライセンスの非互換性のためにどこにも行きませんでした。

4
Thomas Dickey

これはプライバシーとセキュリティに関係していると思います。終了したセッションで行ったことを誰かの目に開いたままにしておくのは賢明ではありません。私のDebianでは、.bash_logoutの完全なエントリは次のとおりです。

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

$SHLVLは、チェーンの最初のシェルの場合は1です。 (シェルから新しいシェルを開始できます。これにより、SHLVLがインクリメントされます。)最初のセッションを終了して、コンソールとプロンプトを誰かに渡すと、コンソールはセッションのコンテンツにアクセスできないようにする必要があります。無許可の目に、そしてそうします。

2
user147505

Initシステムの設定により、ttyがクリアされています。今日では、おそらくsystemd

systemdの場合、TTYVTDisallocateをnoに設定します。

これを実現するには、systemctl edit getty@tty1を実行し、以下のコードを入力します

[Service]
TTYVTDisallocate=no

https://askubuntu.com/questions/58097/how-can-i-remove-the-clear-screen-before-login/781923#78192

コメントは、sysvinitで使用できる構成(getty--noclearオプション)についても言及している長いページを指しています。

http://mywiki.wooledge.org/SystemdNoClear

最後に、gettyの明確な機能(したがって、gettyの--noclearオプション)がすべてのバージョンに存在しているわけではないようです。

システム管理者は、ログインプロンプトを表示する前にコンソールを常にクリアするように設定できます。これを行う最も簡単な方法は、gettyの代わりにmingettyを使用することです。シリアルコンソールのサポートは失われますが、画面のクリアなどのいくつかの機能が得られます。

-- ログアウト後にターミナルをクリアする方法は? 2010年に投稿された回答。

したがって、bash_logoutは、別のゲッティに切り替えることなく画面をクリアする唯一の方法であった可能性があります。

2
sourcejedi