如果我在單一窗格中從 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
帶有兩個附加選項的實際命令:PermitLocalCommand
和LocalCommand
(man 5 ssh_config
有關詳細信息,請參閱)。這樣,您一登入遠端主機,就可以使用遠端主機名稱作為唯一參數來執行幫助程式腳本。
如果您處於tmux
,腳本將繼承TMUX_PANE
環境變數。如果在 之外,腳本將立即退出tmux
,因此即使您在沒有 的情況下使用該函數,它也不會幹擾tmux
。
該腳本將遠端主機名稱與您的前綴進行匹配,並為tmux
.您不限於case
,您可以按照您想要的任何方式建立邏輯(包括與 相符的正規表示式[[
,但您需要bash
更改 shebang)。最後套用樣式。
退出後ssh
,函數將不帶參數呼叫腳本。"$1"
計算結果為一個空字串,與我們的任何模式都不匹配,因此預設樣式default
被傳遞給tmux
.
請注意,您可以在或 in 中指定PermitLocalCommand
and 。不過,您無法如此輕鬆地擺脫包裝器,因為您需要在退出後再次更改背景顏色。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
是不可移植的;看這個問題用於替代方法。
現在我們不需要舊的包裝函數(因此啟動一個新的 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'
我覺得它很優雅。