web-dev-qa-db-ja.com

サーバーにログインしているときに色を変更するようにBashプロンプトを表示する

サーバーにログインしたときに色が変わるように、bashプロンプトを動的にする方法はありますか?

ですから、システム上では緑色を、サーバーに接続すると赤色に変更したいと思います。別に配置したくないサーバーが大量にある.bashrcすべてのもの。

15
nitins

リモートプロンプトは、リモート~/.bashrcによって設定されます。そのため、それをリモートサーバーにコピーする必要があります。ただし、すべてのホストに単一の~/.bashrcを使用して、ホスト名に基づいてプロンプトの色を設定できます。

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    Prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    Prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${Prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset Prompt_color

ノート:

  • PS1がまだ設定されていない場合(つまり、シェルがインタラクティブでない場合)は設定しないでください。 PS1が空でないかどうかをテストすることは、シェルがインタラクティブであるかどうかを判断する非常に一般的な方法であり、それを行うプログラムを混乱させたくありません。 (おそらく、より正確なテストは、$-iが含まれているかどうかをチェックすることです。)

  • リモートサーバーにログインするときにこのコードを実行する場合は、プロファイルファイルの1つが常に~/.bashrcをソースとして持つ必要があります。しかし、私はあなたがそれを知っていると思います。

  • PS1では、エスケープコードを\[...\]で囲む必要があります。

  • \[033[mは、フォアグラウンドとバックグラウンドをデフォルトにリセットします。したがって、ここでは:\wがターミナルのフォアグラウンド/バックグラウンドに表示されます。

  • \[033[48;5;XXXm\033[38;5;YYYmは、背景/前景をXXX/YYYに設定します。

  • 利用可能な色をダンプするスクリプトについては、 colortest を試してください。

  • プロンプトがどのようになるかを確認するには:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
    
9
Matei David

リモートに別のPS1を持たせたくない(できない)場合は、「いいえ」と言いますが、これは少なくとも非常に困難です。 SSH接続では、ローカル側にはシェルプロンプトとは何か、他には何があるのか​​についての実際の考えがないため、プロンプトの色の設定はリモートから行う必要があることを考慮してください。セッションを開始する前に色を設定することもできますが、それらはすべての出力に対して有効です。つまり、lsまたはエディターが独自の色を設定するまでです。

もちろん、セッションのラッパーを考え出してプロンプトのように見えるすべてのものを検出して色付けすることもできますが、それは簡単に誤検知($?のあるすべての行に色を付ける)につながり、ひどく複雑になるでしょう。各マシンの.profileまたは.bashrcに1行をドロップするだけの場合と比較してください。

多くのマシンでは、すべてのマシンで構成変更を同期するソリューションを検索すると便利です。それのために作成されたツール、または単にスクリプト、またはループを実行してそれらすべてに(一連の)構成ファイルをコピーするためのものです。

7
ilkkachu

私は最初に一時プロファイルをアップロードし、次にこのプロファイルを使用してsshを実行する(そして一時ファイルを削除する)sshpassでラッパースクリプトを使用しています。

スクリプトの2つの主なものは次のとおりです。
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

これを使用すると、リモートセッションの色を簡単に定義できます。

これはあなたの質問に直接答えるものではありませんが、それを使って解決することができます。

5
Mikael Kjær

あなたはcontext-colorに興味があるかもしれません、それは私がその正確な目的のためにまとめました: https://github.com/ramnes/context-color

これは、実行時にコマンド出力のハッシュに基づいて色を出力する単純なスクリプトです。 $PATHのどこかにインストールすると、.bashrcで次のようなことができます。

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(ここで、--Prompt/-pはプロンプトの色をエスケープするスイッチであり、\[\e[0m\]は色をリセットするエスケープシーケンスです)

デフォルトでは、ハッシュの生成に使用されるコマンドはwhoami; hostnameです。ホスト名に応じて色を変更したいだけの場合は、$CONTEXT変数環境(export CONTEXT="hostname")を変更するか、単に--context/-cオプション(context-color -c "hostname")を使用できます。

以下の例をご覧ください。

demo

1
ramnes