【小ネタ】iTerm2でSSHログイン先別にコンソールの色を自動的に切替える

iTerm2でSSHログイン先別にコンソールの色を自動的に切替える

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーション株式会社のあのふじたです。 世の中のエンジニアの皆さんは SSH でサーバに接続したとき、ターミナルの背景色を変えたくなりますよね。

Windows であればSSHクライアント側に背景色設定があります。 しかし Mac かつ iTerm2 で作業しているとちょっと面倒です。

弊社の過去記事 iTerm2でSSHログイン先別にプロファイルを自動的に切替えて事故防止する方法 を利用していたのですが ~/.ssh/config のサーバ名とitrem2のプロファイル名を一致させる必要があり サーバが増えるにつれてitrem2のプロファイルが増えることが手間でした。 今回の記事はscriptに直接記載しておく、または別ファイルで管理してプロファイル自体は使いまわせるようにした修正記事になります。 おまけでEC2自体に設定を入れる方法も書いておきました。

(0)事前準備 iTerm2 Profile 作成

まずは切り替える iTerm2 の Profile を作成します。 iTerm2->Preferences->Profiles と選択して今回は以下のように作成しました。

  • SSH接続した際の標準プロファイル ssh-default
  • 本番環境(例:52.198.xxx.xxx)へ接続した際のプロファイル ssh-prod
  • 検証環境(例:54.248.xxx.xxx)へ接続した際のプロファイル ssh-stg
  • 開発環境(例:18.183.xxx.xxx)へ接続した際のプロファイル ssh-dev

(1)クライアント側で切り替える場合の Script

基本的には ssh 実行時の args を正規表現でチェックするだけなので ip のみではなく接続ユーザ名や ~/.ssh/config に記述しているサーバ名でフックすることが可能です。

Script その1 Script に直接記述するパターン

~/bin/ssh-change-profile.sh

#!/bin/bash

set -euo pipefail

# Ctrl-C
trap 'echo -ne "\033]1337;SetProfile=Default\a"; exit;' INT

# 接続先とプロファイル
PROFILE="ssh-default"

CONFIG=(
ec2-user,ssh-default
52.198.xxx.xxx,ssh-prod
54.248.xxx.xxx,ssh-stg
18.183.xxx.xxx,ssh-dev
)

for i in "${CONFIG[@]}";do
    [[ "${*}" =~ ${i%%,*} ]] && PROFILE="${i//*,}"
done

# set profile
echo -ne "\033]1337;SetProfile=${PROFILE}\a"

# ssh login
/usr/bin/ssh "$@"

# set profile(default)
echo -ne "\033]1337;SetProfile=Default\a"

Script その2 設定を外部ファイル(例 ~/.iterm2_hosts )で管理する場合

~/.iterm2_hosts

ec2-user,ssh-default
52.198.xxx.xxx,ssh-prod
54.248.xxx.xxx,ssh-stg
18.183.xxx.xxx,ssh-dev

~/bin/ssh-change-profile.sh

#!/bin/bash

set -euo pipefail

# Ctrl-C
trap 'echo -ne "\033]1337;SetProfile=Default\a"; exit;' INT

# 接続先とプロファイル
PROFILE="ssh-default"
CONFIG="${HOME}/.iterm2_hosts"

[[ -f "${CONFIG}" ]] && while read -r i; do
    [[ "${*}" =~ ${i%%,*} ]] && PROFILE="${i//*,}"
done < "${CONFIG}"

# set profile
echo -ne "\033]1337;SetProfile=${PROFILE}\a"

# ssh login
/usr/bin/ssh "$@"

# set profile(default)
echo -ne "\033]1337;SetProfile=Default\a"

その1かその2の script を作成後に実行権限付与します。

chmod +x ~/bin/ssh-change-profile.sh

.bash_profile もしくは .zshrc に書き込む

# bash
echo "alias ssh='~/bin/ssh-change-profile.sh'" >>~/.bash_profile

OR

# zsh
echo "alias ssh='~/bin/ssh-change-profile.sh'" >>~/.zshrc

.bash_profile もしくは .zshrc を反映

# bash
source ~/.bash_profile

OR

# zsh
source ~/.zshrc

あとは実際にログインして冒頭のGIF同様にプロファイルが切り替われば完了です。

(2)サーバー側で切り替える場合

切り替える iTerm2 の Profile(例:ec2-prod) は作成済とします。

  • SSH接続した際の標準プロファイル ssh-default
  • 本番EC2(例:3.112.xxx.xxx)へ接続した際のプロファイル ec2-prod

EC2側の設定(例:3.112.xxx.xxx)

SSH接続時のプロファイル設定を追加します。 SSHログアウト時に戻す設定も追加します。 尚、iterm2側にプロファイル設定がない場合は無視されます。

echo 'echo -ne "\033]1337;SetProfile=ec2-prod\a"' >>.bash_profile
source .bash_profile
echo 'echo -ne "\033]1337;SetProfile=Default\a"' >>.bash_logout

実際にログインし設定、ログアウト後に再度プロファイルが切り替わることを確認します。

この設定をansible等で各サーバーに配布しておくと漏れなく反映できます。

チームでiterm2のプロファイルを統一して設定しておけば、プロファイルが自動で切り替わるので精神衛生上とても良いと思います。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。 「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。 現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。 少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

最後に

気づけばJOINブログの次の投稿に1年以上経っておりました...。 2023年はもうちょっとペースを上げていきたいですね。

補足:この記事はほとんど濱田さんの記事 iTerm2でSSHログイン先別にプロファイルを自動的に切替えて事故防止する方法 の焼き直しです。

事前に書いていいですか?と聞いたところ問題なく了承頂けました。
またサーバ側に設定するアイデアについては植木さんからのご提供です。
濱田さん植木さんありがとうございました。