
単一のペインで 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/config
ssh
それでも、ラッパーレスのソリューションが望まれるかもしれません。スクリプト( で呼び出される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'
とてもエレガントだと思います。