サーバーにログインすると色が変わるように、bashプロンプトを動的にする方法はありますか?
そのため、システム上では緑になり、サーバーに接続されると赤に変わるようにしたいのです。膨大な数のサーバーがあり.bashrc
、それらすべてに異なるサーバーを配置したくありません。
サーバーにログインすると色が変わるように、bashプロンプトを動的にする方法はありますか?
そのため、システム上では緑になり、サーバーに接続されると赤に変わるようにしたいのです。膨大な数のサーバーがあり.bashrc
、それらすべてに異なるサーバーを配置したくありません。
回答:
リモートプロンプトは、リモートによって設定されます~/.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;YYYm
background / foregroundをXXX
/に設定しますYYY
。
利用可能な色をダンプするスクリプトについては、を試してくださいcolortest
。
プロンプトの表示を確認するには:
echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
リモートに別のを持たせたくない(できない)PS1
場合は、「いいえ」と言いますが、それは少なくともひどく難しいでしょう。SSH接続では、ローカルサイドにはシェルプロンプトと他の何かについての本当の考えがないため、プロンプトの色の設定は実際にはリモートから行う必要があることを考慮してください。セッションを開始する前に色を設定することもできますが、それらはすべての出力、つまりls
、エディターまたはエディターが独自の色を設定するまで有効です。
もちろん、プロンプトのように見えるものすべてを検出して色付けするセッションのラッパーを考え出すことはできますが、それは簡単に誤検知($
?のあるすべての行の色)を引き起こし、単に.profile
または.bashrc
各マシンの単一行。
いくつかのマシンでは、すべてのマシンで構成の変更を同期するソリューションを検索することは、どのような場合でも役立つ可能性があります。それのために作られた何らかのツールでも、単なるスクリプトでも、ループを実行してすべての設定ファイル(のセット)をコピーしてもかまいません。
最初に一時プロファイルをアップロードし、次にこのプロファイルを使用して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"
これを使用すると、リモートセッションの色を簡単に定義できます。
私はこれがあなたの質問に直接答えないことを知っていますが、それを解決するために使うことができます。
sshpass -p
可能な限り使用しないでください!実行中のプログラムのコマンドライン引数は、通常、すべてのユーザーに表示されps
、パスワードも表示されます。マシン上に他のユーザーアカウントがない場合でも、誤って画面に印刷する可能性があります。sshpass
環境変数からパスワードを読み取ることができます。使用するのはそれほど難しくありません。また、ログイン資格情報をファイルに保存する場合は、sshキーを検討してください。
あなたが興味があるかもしれません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"
)を使用できます。
例については、以下を参照してください。