단일 창의 tmux에서 원격 서버로 SSH를 통해 연결하는 경우 서버 이름에 따라 창의 배경색을 변경할 수 있습니까?
prod_XYZ
내 모든 prod 서버가 다음으로 시작 하고 개발 서버가 다음으로 시작한다고 가정해 보겠습니다. dev_XYZ.
이 두 서버에 ssh를 연결하면 현재 사용 중인 서버 유형에 따라 색상을 다르게 지정할 수 있나요? 즉, 서버 접두사를 기반으로 합니까?
답변1
이 두 서버에 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
두 가지 추가 옵션을 사용하여 실제 명령을 실행합니다( 자세한 내용은 참조 ). 이렇게 하면 원격 호스트에 로그인하자마자 원격 호스트 이름을 유일한 인수로 사용하여 도우미 스크립트를 실행할 수 있습니다.PermitLocalCommand
LocalCommand
man 5 ssh_config
에 있는 경우 tmux
스크립트는 TMUX_PANE
환경 변수를 상속합니다. 가 아닌 경우 스크립트가 즉시 종료되므로 tmux
가 아닌 기능을 사용해도 방해가 되지 않습니다 tmux
.
스크립트는 원격 호스트 이름을 접두사와 일치시키고 에 대해 원하는 스타일을 선택합니다 tmux
. 에 국한되지 않고 case
원하는 방식으로 논리를 구축할 수 있습니다( 와의 정규식 일치를 포함 [[
하지만 bash
그 다음에는 shebang을 변경해야 함). 마지막에 스타일이 적용됩니다.
종료 후 ssh
함수는 인수 없이 스크립트를 호출합니다. "$1"
패턴과 일치하지 않는 빈 문자열로 평가되므로 기본 스타일이 default
에 전달됩니다 tmux
.
PermitLocalCommand
및 LocalCommand
in /etc/ssh/ssh_config
또는 in 을 지정할 수 있습니다 ~/.ssh/config
. 하지만 ssh
종료 후 배경색을 다시 변경해야 하기 때문에 래퍼를 그렇게 쉽게 제거할 수는 없습니다 .
여전히 래퍼 없는 솔루션이 필요할 수 있습니다. LocalCommand
상위( ssh
's) 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'
나는 그것이 꽤 우아하다고 생각합니다.