SSH接続先のホスト名でmacOS Terminalの背景色を自動で変える

  • macOS
  • AppleScript
  • SSH

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

本番環境に間違って気づかずコマンドを打ってしまう事故を防ぎたくて、ssh接続時に接続先の種類でTerminal.appの背景色を自動で変えるスクリプトを書いた。

やりたいこと

ssh コマンドをラップして、接続先ホスト名に prod / dev が含まれていたら背景色を変える。切断したら元の色に戻す。

実装

#!/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
if [[ "$@" =~ prod ]]; then
set_bg "{26214, 0, 0, 50000}"
elif [[ "$@" =~ dev ]]; then
set_bg "{11565, 0, 19789, 50000}"
fi
/usr/bin/ssh "$@"

trap on_exit EXIT で、sshが終了したタイミング(正常終了でも切断でも)で背景色をデフォルトに戻す。osascript で Terminal アプリのwindow 1に対して直接色を指定する形。

動いてはいるけど雑だった部分

最初に書いたバージョンには以下の問題があった。

  • sed でわざわざ HOSTNAME を抽出しているのに、実際の判定は $@(引数全体)に対して行っていた。ユーザー名の方に prod や dev という文字列が偶然含まれていても誤爆する。判定は $HOSTNAME に対して行うべきだった。
  • [[ "$@" =~ prod ]] は正規表現の部分一致なので、たとえば production-test のようなホスト名でも意図せずマッチする。case 文で *prod* のような判定にした方が安全そう。
  • on_exit の中に set transparency to 0 という行を単独で書いていたことがあった。これは osascript -e "..." の外に書くと AppleScriptではなくbashのコマンドとして 解釈されてしまう(set はbashの組み込みコマンド)。エラーになるか無視されるだけで、意図した動作にはならない。この行は不要だったので削除した。

修正後は判定を HOSTNAME に対する case 文にまとめた。

#!/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
*prod*) set_bg "{26214, 0, 0, 50000}" ;;
*dev*) set_bg "{11565, 0, 19789, 50000}" ;;
esac
/usr/bin/ssh "$@"

使い方

ssh のエイリアスかPATH上の別名(例えば sshc など)として置いておけば、普段通り sshc user@prod-host のように打つだけで色が切り替わる。

RGBAではなくAppleScriptの色指定(各チャンネル0〜65535 + アルファ相当の値)なので、色を追加したい場合はこの範囲で値を決める必要がある。ここは実機で試しながら調整した方が早い。