根據遠端主機名稱變更 tmux 窗格的背景顏色

根據遠端主機名稱變更 tmux 窗格的背景顏色

如果我在單一窗格中從 tmux ssh 到遠端伺服器,是否可以根據伺服器名稱變更窗格的背景顏色?

假設我所有的產品伺服器都以 開頭prod_XYZ,開發伺服器以 開頭dev_XYZ.如果我 ssh 到這兩個伺服器,我可以根據我所在的伺服器類型對它們進行不同的著色嗎?也就是說,基於伺服器前綴?

答案1

如果我透過 ssh 連接到這兩台伺服器,我可以根據我所在的伺服器類型為它們設定不同的顏色嗎?

是的。

我的基本解決方案需要一個包裝器ssh(這可能是一個 shell 函數或一個腳本),以及一個額外的幫助程式腳本。


包裝函數應該是這樣的:

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帶有兩個附加選項的實際命令:PermitLocalCommandLocalCommandman 5 ssh_config有關詳細信息,請參閱)。這樣,您一登入遠端主機,就可以使用遠端主機名稱作為唯一參數來執行幫助程式腳本。

如果您處於tmux,腳本將繼承TMUX_PANE環境變數。如果在 之外,腳本將立即退出tmux,因此即使您在沒有 的情況下使用該函數,它也不會幹擾tmux

該腳本將遠端主機名稱與您的前綴進行匹配,並為tmux.您不限於case,您可以按照您想要的任何方式建立邏輯(包括與 相符的正規表示式[[,但您需要bash更改 shebang)。最後套用樣式。

退出後ssh,函數將不帶參數呼叫腳本。"$1"計算結果為一個空字串,與我們的任何模式都不匹配,因此預設樣式default被傳遞給tmux.


請注意,您可以在或 in 中指定PermitLocalCommandand 。不過,您無法如此輕鬆地擺脫包裝器,因為您需要在退出後再次更改背景顏色。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是不可移植的;看這個問題用於替代方法。

現在我們不需要舊的包裝函數(因此啟動一個新的 shell 或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'

我覺得它很優雅。

相關內容