特定のサーバーに SSH 接続するときに Apple ターミナル ウィンドウのカラー スキームを自動的に変更するにはどうすればよいですか
-
03-07-2019 - |
質問
リモート実稼働サーバーに SSH 接続するときに、ターミナル ウィンドウの配色を明るくて怖いもの (できれば赤) に変更して、ライブの恐ろしいサーバーに触れていることを警告したいと考えています。
どこかに SSH 接続したことを自動的に検出し、そのどこかが特定のリストに含まれている場合にカラースキームを変更するにはどうすればよいですか?
Terminal.app のスキームを更新したいのですが、純粋な Linux/UNIX 環境でこれを行う方法がわかりません
解決
以下のスクリプトを入れます ~/bin/ssh
(確保する ~/bin/
前に見た /usr/bin/
PATH 内):
#!/bin/sh
HOSTNAME=`echo $@ | sed s/.*@//`
set_bg () {
osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"
}
on_exit () {
set_bg "{0, 0, 0, 50000}"
}
trap on_exit EXIT
case $HOSTNAME in
production1|production2|production3) set_bg "{45000, 0, 0, 50000}" ;;
*) set_bg "{0, 45000, 0, 50000}" ;;
esac
/usr/bin/ssh "$@"
上記のスクリプトは、「username@host」行からホスト名を抽出します (「ssh user@host」を使用してリモート ホストにログインしていることを前提としています)。
次に、ホスト名に応じて、赤色の背景 (運用サーバーの場合) または緑色の背景 (その他すべてのサーバーの場合) が設定されます。その結果、すべての SSH ウィンドウの背景が色付きになります。
ここでは、デフォルトの背景が黒であると仮定します。そのため、リモート サーバーからログアウトすると、スクリプトは背景色を黒に戻します (「trap on_exit」を参照)。
ただし、このスクリプトは、あるホストから別のホストへの SSH ログインのチェーンを追跡しないことに注意してください。その結果、最初にテストサーバーにログインし、次にそこから本番環境にログインする場合、背景は緑色になります。
他のヒント
ターミナルのあまり知られていない機能は、設定プロファイルの名前をコマンド名に設定できることです。シェル>新しいコマンド… またはシェル>新しいリモート接続… 。
たとえば、デフォルトのプロファイルを複製し、“ ssh”という名前を付けます。背景色を赤に設定します。次に、新しいコマンド… を使用して、 ssh host.example.com
を実行します。
引数にも一致するため、たとえば、リモートホストごとに異なる設定を選択できます。
これは、出口を処理するいくつかの既存の回答に基づいた複合ソリューションです。また、16ビットのカラー値を処理したくない場合は、少し余分に追加します。
これは、〜/ .bash_profile
に配置する必要があります# Convert 8 bit r,g,b,a (0-255) to 16 bit r,g,b,a (0-65535)
# to set terminal background.
# r, g, b, a values default to 255
set_bg () {
r=${1:-255}
g=${2:-255}
b=${3:-255}
a=${4:-255}
r=$(($r * 256 + $r))
g=$(($g * 256 + $g))
b=$(($b * 256 + $b))
a=$(($a * 256 + $a))
osascript -e "tell application \"Terminal\" to set background color of window 1 to {$r, $g, $b, $a}"
}
# Set terminal background based on hex rgba values
# r,g,b,a default to FF
set_bg_from_hex() {
r=${1:-FF}
g=${2:-FF}
b=${3:-FF}
a=${4:-FF}
set_bg $((16#$r)) $((16#$g)) $((16#$b)) $((16#$s))
}
# Wrapping ssh command with extra functionality
ssh() {
# If prod server of interest, change bg color
if ...some check for server list
then
set_bg_from_hex 6A 05 0C
end
# Call original ssh command
if command ssh "$@"
then
# on exit change back to your default
set_bg_from_hex 24 34 52
fi
}
- set_bg-4(8ビット)色の値を取ります
- set_bg_from_hex-4つの16進値を取ります。私が使用するほとんどの色参照は16進数であるため、これにより簡単になります。 RR GG BBの代わりに#RRGGBBを実際に解析するためにさらに一歩踏み込むこともできますが、私にとってはうまくいきます。
- ssh-デフォルトのsshコマンドを任意のカスタムロジックでラップします。 ifステートメントは、出口を処理して背景色をリセットするために使用されます。
1 の説明に従って、次の内容の〜/ bin / ssh
ファイルを作成します。
#!/bin/sh
# https://stackoverflow.com/a/39489571/1024794
log(){
echo "$*" >> /tmp/ssh.log
}
HOSTNAME=`echo $@ | sed s/.*@//`
log HOSTNAME=$HOSTNAME
# to avoid changing color for commands like `ssh user@host "some bash script"`
# and to avoid changing color for `git push` command:
if [ $# -gt 3 ] || [[ "$HOSTNAME" = *"git-receive-pack"* ]]; then
/usr/bin/ssh "$@"
exit $?
fi
set_bg () {
if [ "$1" != "Basic" ]; then
trap on_exit EXIT;
fi
osascript ~/Dropbox/macCommands/StyleTerm.scpt "$1"
}
on_exit () {
set_bg Basic
}
case $HOSTNAME in
"178.222.333.44 -p 2222") set_bg "Homebrew" ;;
"178.222.333.44 -p 22") set_bg "Ocean" ;;
"192.168.214.111") set_bg "Novel" ;;
*) set_bg "Grass" ;;
esac
/usr/bin/ssh "$@"
実行可能にする: chmod + x〜/ bin / ssh
。
ファイル〜/ Dropbox / macCommands / StyleTerm.scpt
の内容は次のとおりです。
#https://superuser.com/a/209920/195425
on run argv
tell application "Terminal" to set current settings of selected tab of front window to first settings set whose name is (item 1 of argv)
end run
単語 Basic、Homebrew、Ocean、Novel、Grass
は、mac os端末設定 cmd 、からのものです。
.bashrcで$ PS1変数を設定できます。
red='\e[0;31m'
PS1="$\[${red}\]"
編集: これを行うには、ターミナルを開きます。次に言う
#touch .bashrc
.bashrcをtextEditまたは TextWrangler で開いて追加できます。前のコマンド。
別の解決策は、ssh構成ファイルで色のストレートを設定することです:
〜/ .ssh / config内
Host Server1
HostName x.x.x.x
User ubuntu
IdentityFile ~/Desktop/keys/1.pem
PermitLocalCommand yes
LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {27655, 0, 0, -16373}"
Host Server2
HostName x.x.x.x
User ubuntu
IdentityFile ~/Desktop/keys/2.pem
PermitLocalCommand yes
LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {37655, 0, 0, -16373}"
Xterm互換のUnix端末には、背景色と前景色を設定するための標準のエスケープシーケンスがあります。 Terminal.appがそれらを共有するかどうかはわかりません。
case $HOSTNAME in
live1|live2|live3) echo -e '\e]11;1\a' ;;
testing1|testing2) echo -e '\e]11;2\a' ;;
esac
2番目の数字は、目的の色を指定します。 0 =デフォルト、1 =赤、2 =緑などです。このスニペットを共有.bashrcに入れると、ライブサーバーで背景が赤になり、テストサーバーで背景が緑になります。ログアウト時にバックグラウンドをリセットするには、このようなものも追加する必要があります。
on_exit () {
echo -e '\e]11;0\a'
}
trap on_exit EXIT
編集:Googleは AppleScriptを使用して背景色を設定する方法を見つけました。明らかに、これはTerminal.appと同じマシンで実行された場合にのみ機能します。いくつかのラッパー関数でこれを回避できます:
set_bg_color () {
# color values are in '{R, G, B, A}' format, all 16-bit unsigned integers (0-65535)
osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"
}
sshl () {
set_bg_color "{45000, 0, 0, 50000}"
ssh "$@"
set_bg_color "{0, 0, 0, 50000}"
}
ライブサーバーに接続するときは、sshではなくsshlを実行することを忘れないでください。別のオプションは、既知のライブホスト名の引数をスキャンし、それに応じて背景を設定するsshのラッパー関数を作成することです。
SSH経由でログインするたびにシェルプロンプトを変更しないのはなぜですか?通常、特定のシェル変数があります: SSH_CLIENT 、 SSH_CONNECTION 、 SSH_TTY
サーバーの /。bashrc
で端末の色を設定します
同じことが必要でした。開発環境ではなくステージングサーバーまたは実稼働サーバーにいることを認識させるためです。特に、Rubyコンソールなどの場合は非常にわかりにくいものです。
これを達成するために、サーバーの〜。/ bashrc
ファイルで setterm
コマンドを使用して、接続時に端末の色を反転し、終了時に色を復元しました。
〜/ .bashrc
# Inverts console colours so that we know that we are in a remote server.
# This is very important to avoid running commands on the server by accident.
setterm --inversescreen on
# This ensures we restore the console colours after exiting.
function restore_screen_colours {
setterm --inversescreen off
}
trap restore_screen_colours EXIT
次に、これをすべてのサーバーの〜/ .bashrc
ファイルに入れて、端末がリモートサーバーにあるかどうかを確認します。
もう1つのボーナスは、開発チームまたはdevopsチームがオンボーディングプロセスの一部にすることなく、このメリットを享受できることです。
優れた動作。
ユーザー名とホストマシン名の色を変更する必要があります。
次の行を〜/ .bash_profile
ファイルに追加します:
export PS1=" \[\033[34m\]\u@\h \[\033[33m\]\w\[\033[31m\]\[\033[00m\] $ "
最初の部分(紫色)は探しているものです。
これは私の好みの色です。 ANSIカラーコードである m
コード(たとえば 34m
)を変更することにより、プロンプトの色の各部分をカスタマイズできます。
ANSIカラーコードのリスト:
- 黒:30m
- 赤:31m
- 緑:32m
- 黄色:33m
- 青:34m
- 紫:35m
- シアン:36m
- 白:37m