概要

自分はさくらのVPS上でKonbuNBAMashのようなWebアプリを運用している。

最近、ローカルで操作しているつもりが実はVPS上で操作をしていて、うっかりコンテナを落としてしまうというミスを多発させてしまった。

そこで本番環境にSSHログインをした際にはターミナルの配色を変更して、視覚的に本番環境とローカル環境を差別化することで本番環境での誤操作を防ぐことにした。

方法

.bash_profileに以下のコードを追加した。

# ssh接続時に文字色と背景色を変更する関数
function ssh() {
    if [[ "$TERM_PROGRAM" == "vscode" ]]; then
        DEFAULT_COLOR="#CCCCCC"
        DEFAULT_BG_COLOR="#171717"
    elif [[ "$TERM_PROGRAM" == "Apple_Terminal" ]]; then
        DEFAULT_COLOR="#000000"
        DEFAULT_BG_COLOR="#FFFFFF"
    fi

    # SSH接続時に文字色と背景色を変える
    echo -ne "\033]10;#FFFFFF\007"
    echo -ne "\033]11;#330000\007"

    # 実際にsshを実行
    command ssh "$@"


    # 接続終了後に元の文字色と背景色に戻す
    echo -ne "\033]10;${DEFAULT_COLOR}\007"
    echo -ne "\033]11;${DEFAULT_BG_COLOR}\007"
}

コードを順を追って説明する。

まずは以下のようなsshの関数を書くことで、デフォルトのsshコマンドを上書きする。

引数は$@で取得できるので、ssh 引数1 引数2 ...のように実行したら、関数の内部でもちゃんとssh 引数1 引数2 ...のように実行される。

# ssh接続時に文字色と背景色を変更する関数
function ssh() {
    (...中略...)

    # 実際にsshを実行
    command ssh "$@"

    (...中略...)
}

次にデフォルトの文字色と背景色を変数に格納する。

API経由でいい感じに配色を取得できれば嬉しいのだが、あまりルールの標準化がされていないようで、OSやターミナルによって配色の取得方法はまちまちのようだった。

Qiitaのターミナルの背景色を取得するという記事で背景色を取得する方法が解説されていたのだが、難しそうだったので採用は断念した。

仕方がないので自分がよく使うVSCodeとMacの標準ターミナルの文字色と背景色をハードコーディングしている。

if [[ "$TERM_PROGRAM" == "vscode" ]]; then
    DEFAULT_COLOR="#CCCCCC"
    DEFAULT_BG_COLOR="#171717"
elif [[ "$TERM_PROGRAM" == "Apple_Terminal" ]]; then
    DEFAULT_COLOR="#000000"
    DEFAULT_BG_COLOR="#FFFFFF"
fi

次にSSH接続前に文字色と背景色を変更するためのコードを追加する。

# SSH接続時に文字色と背景色を変える
echo -ne "\033]10;#FFFFFF\007"
echo -ne "\033]11;#330000\007"

他のターミナルと被らなそうな赤っぽい背景に白い文字という配色にした。

Terminal

最後にSSH接続終了後に元の文字色と背景色に戻すためのコードを追加する。

# 接続終了後に元の文字色と背景色に戻す
echo -ne "\033]10;${DEFAULT_COLOR}\007"
echo -ne "\033]11;${DEFAULT_BG_COLOR}\007"

ちなみにこの配色を元に戻すコードはexitCtrl+Cで明示的にSSH接続を終了したときには実行されるが、ターミナルを長時間放置したりしてセッションが切断されたときには実行されない。

個人的には本番環境をローカル環境だと勘違いして誤操作するのが嫌なだけで、ローカル環境を本番環境だと勘違いして誤操作する分にはまあいっかくらいに思っているので、ローカル環境に戻っても配色がもとに戻らない可能性があるという問題は許容することにした。

多分trapとかを上手く使えば色々なパターンのSSH接続の切断にも対応できる気はする。

もし上手く出来た方がいたらコメント欄で教えてほしい。