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


15

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

そのため、システム上では緑になり、サーバーに接続されると赤に変わるようにしたいのです。膨大な数のサーバーがあり.bashrc、それらすべてに異なるサーバーを配置したくありません。


おそらくない。しかしそれは裏をsuperuser.com/questions/33712/...
ランダム

1
端末を赤(または他の色)にして、接続したときにデフォルトの白が表示されるようにしますか?
モニカの復活-ζ--16年

回答:


9

リモートプロンプトは、リモートによって設定されます~/.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。)

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

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

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

  • \[033[48;5;XXXm\033[38;5;YYYmbackground / foregroundをXXX/に設定しますYYY

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

  • プロンプトの表示を確認するには:

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

7

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

もちろん、プロンプトのように見えるものすべてを検出して色付けするセッションのラッパーを考え出すことはできますが、それは簡単に誤検知($?のあるすべての行の色)を引き起こし、単に.profileまたは.bashrc各マシンの単一行。

いくつかのマシンでは、すべてのマシンで構成の変更を同期するソリューションを検索することは、どのような場合でも役立つ可能性があります。それのために作られた何らかのツールでも、単なるスクリプトでも、ループを実行してすべての設定ファイル(のセット)をコピーしてもかまいません。


2
その最後の段落が重要です。OPが「膨大な数のサーバー」を管理している場合、そもそも各サーバーを個別に構成する必要があるのは驚くべきことです。
モニカとの軽さレース

5

最初に一時プロファイルをアップロードし、次にこのプロファイルを使用して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"

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

私はこれがあなたの質問に直接答えないことを知っていますが、それを解決するために使うことができます。


3
sshpass -p可能な限り使用しないでください!実行中のプログラムのコマンドライン引数は、通常、すべてのユーザーに表示されps、パスワードも表示されます。マシン上に他のユーザーアカウントがない場合でも、誤って画面に印刷する可能性があります。sshpass環境変数からパスワードを読み取ることができます。使用するのはそれほど難しくありません。また、ログイン資格情報をファイルに保存する場合は、sshキーを検討してください。
-ilkkachu

あなたは正しいです、そして私はそれの使用を促進しようとしていませんでした。開発目的でのみ使用され、セキュリティリスクをもたらさないスクリプトの例を貼り付けました。SSHPASS変数は、sshキーが使用される実稼働システムでは空のままになります。更新します。
ミカエルケア

1

あなたが興味があるかもしれません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")を使用できます。

例については、以下を参照してください。

デモ

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