

SSH接続先のホスト名でmacOS Terminalの背景色を自動で変える
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
本番環境に間違って気づかずコマンドを打ってしまう事故を防ぎたくて、ssh接続時に接続先の種類でTerminal.appの背景色を自動で変えるスクリプトを書いた。
やりたいこと
ssh コマンドをラップして、接続先ホスト名に prod / dev が含まれていたら背景色を変える。切断したら元の色に戻す。
実装
#!/bin/shHOSTNAME=`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/shHOSTNAME=$(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 + アルファ相当の値)なので、色を追加したい場合はこの範囲で値を決める必要がある。ここは実機で試しながら調整した方が早い。