リモートホスト名に応じて tmux ペインの背景色を変更する

リモートホスト名に応じて tmux ペインの背景色を変更する

単一のペインで tmux からリモート サーバーに ssh 接続する場合、サーバー名に基づいてペインの背景色を変更することは可能ですか?

すべての本番サーバーが で始まりprod_XYZ、開発サーバーが で始まるとします。dev_XYZ.これらの 2 つのサーバーに ssh で接続する場合、使用しているサーバーのタイプに基づいて異なる色で表示できますか? つまり、サーバーのプレフィックスに基づいて色分けできますか?

答え1

これら 2 つのサーバーに ssh で接続する場合、接続しているサーバーの種類に応じて異なる色を設定できますか?

はい。

私の基本的な解決策には、ラッパーssh(シェル関数またはスクリプト) と追加のヘルパー スクリプトが必要です。


ラッパー関数は次のようになります。

ssh() {
  helper="$HOME/bin/_ssh_tmux_background"
  command ssh \
    -o PermitLocalCommand=yes \
    -o LocalCommand="'$helper' '%h'" \
    "$@"
  "$helper"
}

これはヘルパー スクリプトです。

#/bin/sh

[ -z "$TMUX_PANE" ] && exit
style=default
case "$1" in
    prod_* )
        style='bg=red'
        ;;
    dev_* )
        style='bg=blue'
        ;;
esac   
tmux select-pane -P "$style" -t "$TMUX_PANE"

$helper関数内の が指す場所 (私のコード内) にスクリプトを保存し$HOME/bin/_ssh_tmux_background、実行可能にします。

ここで を呼び出すとssh、関数はとsshの 2 つの追加オプションを使用して実際のコマンドを実行しますPermitLocalCommand(詳細についてLocalCommandは を参照してくださいman 5 ssh_config)。このようにして、リモート ホストにログインするとすぐに、リモート ホスト名を唯一の引数としてヘルパー スクリプトが実行されます。

の場合tmux、スクリプトは環境変数を継承しますTMUX_PANE。 の外側の場合、スクリプトは直ちに終了するためtmux、 なしで関数を使用しても干渉することはありませんtmux

スクリプトは、リモート ホスト名をプレフィックスと照合し、 の目的のスタイルを選択しますtmux。 に限定されずcase、任意の方法でロジックを構築できます ( との正規表現のマッチングを含むが[[、その場合はシェバンを変更する必要がありますbash)。最後に、スタイルが適用されます。

が終了した後ssh、関数は引数なしでスクリプトを呼び出します。 は"$1"どのパターンにも一致しない空の文字列として評価されるため、 のデフォルト スタイルdefaultが に渡されますtmux


または で とをPermitLocalCommand指定できることに注意してください。ただし、終了した後に背景色を再度変更する必要があるため、ラッパーを簡単に削除することはできません。LocalCommand/etc/ssh/ssh_config~/.ssh/configssh

それでも、ラッパーレスのソリューションが望まれるかもしれません。スクリプト( で呼び出されるLocalCommand)が親(sshの)のPIDを取得し、バックグラウンドにフォークし(つまりssh継続し)、PIDを監視し、終了tmux後に設定を復元するとしますssh。このようなスクリプトは、保存スタイルを使用する代わりに、ペインの元のスタイルを(それが何であったかに関係なく)保存し、後で復元しますdefault

やってみましょう。これが私の試みです:

#/bin/sh

[ -z "$TMUX_PANE" ] && exit
[ "$#" -eq 1 ] || exit 1

newstyle="$1"
oldstyle="$(tmux select-pane -g -t "$TMUX_PANE")"

tmux select-pane -P "$newstyle" -t "$TMUX_PANE"

( tail --pid="$PPID" -f /dev/null
  tmux select-pane -P "$oldstyle" -t "$TMUX_PANE" ) &

新しいスクリプト( とします$HOME/bin/_ssh_tmux_style)も実行可能である必要があります。 はtail --pid移植性のない を使用しています。この質問代替アプローチについては。

これで、古いラッパー関数は不要になりました (新しいシェルまたは を起動しますunset -f ssh)。必要なのは だけです~/.ssh/config。 はman 5 ssh_config次のことを覚えておいてください:

各パラメータに対して最初に取得された値が使用されるため、ホスト固有の宣言はファイルの先頭近くに指定し、一般的なデフォルトは末尾に指定する必要があります。

これを念頭に置いて、次のものを適切な場所に配置します~/.ssh/config

Host prod_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=red'

Host dev_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=blue'

二重引用符は重要です。追加の設定 (スタイル) 全体が の設定に埋め込まれていることに注意してくださいssh。 を$PATH含める$HOME/binと、さらに良くなります。

LocalCommand=_ssh_tmux_style 'bg=red'

とてもエレガントだと思います。

関連情報