MacでSSHログインと同時にターミナルの色を変える
いっぱいターミナルを開いていると間違って本番サーバで開発サーバ用のコマンドを実行しそうになってヒヤリとすることがあります。 そんなわけでSSH接続時、接続先ごとに自動的にターミナルの背景を変えるようにしてみました。以下のスクショのようになります。

解説
背景色の選択はAppleScriptでやります。以下のような関数を~/.zshrcに書いておく
# ~/.zshrc
function terminal-color () {
/usr/bin/osascript -e "tell application \"Terminal\" to set current settings of first window to settings set \"$1\""
}
これで、terminal-color 'Red Sands'のようにターミナルのテーマを指定して実行すると、背景色が変わります。
ついでに、踏み台サーバを経由するような場合も自動でそこまでたどり着けるように、コマンドを自動で連続してターミナルに流し込めるようにするAppleScriptも書いた。
# ~/terminal-exec.scpt
on run argv
tell application "Terminal" to activate
tell application "System Events" to tell process "Terminal" to keystroke "t" using command down
tell application "Terminal"
repeat with x in argv
do script x in front window
end repeat
end tell
end run
これをコマンドで呼び出せるようにシェル関数でラップする。
function terminal-exec() {
/usr/bin/osascript ~/terminal-exec.scpt $@
}
ここまでで
terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.1"
のようにコマンドを実行すれば、背景色を変えてSSH接続できるようになります。踏み台サーバがあるときはSSHコマンドを並べて書くだけでいいです。
terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.1" "ssh kohkimakimoto@192.168.56.2"
さて、この長ったらしいコマンドを毎回手打ちするわけもなく、pecoを利用したコマンドランチャーを利用します。これは以前のエントリ pecoをランチャーのようにして使う - オープンソースこねこね に書いたが当時のものから少し変わっているので、改めて以下にzshの関数を以下に貼り付けておきます。
# ~/.zshrc
function peco-snippets() {
local line
local snippet
local cwd
local snippet_file
local local_snippet_file
local direct_run
# Get a snippets file in the current directory if it exists.
cwd=`pwd`
if [ -e "$cwd/.snippets" ]; then
local_snippet_file="$cwd/.snippets"
else
local_snippet_file=""
fi
# Do not load home snippets as a local snippets
if [ $HOME = $cwd ]; then
local_snippet_file=""
fi
direct_run=0
if [ $# -ge 1 ]; then
# Load sub snippets file and selected line will be run directly.
direct_run=1
snippet_file=$1
local_snippet_file=""
else
snippet_file=$ZSH_EXT_ROOT/snippets
fi;
if [ ! -e "$snippet_file" ]; then
echo "$snippet_file is not found." >&2
return 1
fi
line=$(cat $local_snippet_file $snippet_file | grep -v "^\s*#" | grep -v '^\s*$' | peco --query "$LBUFFER")
if [ -z "$line" ]; then
return 1
fi
snippet=$(echo "$line" | sed "s/^[ |\*]*\[[^]]*\] *//g")
if [ -z "$snippet" ]; then
return 1
fi
if [ $direct_run -eq 1 ]; then
eval $snippet
else
BUFFER="$snippet"
zle clear-screen
fi
}
zle -N peco-snippets
bindkey '^x^x' peco-snippets
pecoがインストールされていない環境はインストールしておきます。
そして、以下のようなコマンドを列挙したスニペットファイルを用意します。
# ~/.snippets [ssh connect: hakoniwa-local1] terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.20 -p 22" [ssh connect: hakoniwa-local2] terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.21 -p 22" [ssh connect: hakoniwa-local3] terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.22 -p 22" [ssh connect: hakoniwa-local4] terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.23 -p 22" [ssh connect: hakoniwa-local5] terminal-exec "terminal-color 'Pro remote'" "ssh kohkimakimoto@192.168.56.24 -p 22"
これでcontrol+x control+xのショートカットでスクショにあるようにssh接続先一覧が出て、そこから選べるようになります。 ちなみに本番サーバはレッド、開発サーバやローカルの仮想環境はブルーで表示されるようにしています。