원격 호스트 이름에 따라 tmux 창의 배경색 변경

원격 호스트 이름에 따라 tmux 창의 배경색 변경

단일 창의 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두 가지 추가 옵션을 사용하여 실제 명령을 실행합니다( 자세한 내용은 참조 ). 이렇게 하면 원격 호스트에 로그인하자마자 원격 호스트 이름을 유일한 인수로 사용하여 도우미 스크립트를 실행할 수 있습니다.PermitLocalCommandLocalCommandman 5 ssh_config

에 있는 경우 tmux스크립트는 TMUX_PANE환경 변수를 상속합니다. 가 아닌 경우 스크립트가 즉시 종료되므로 tmux가 아닌 기능을 사용해도 방해가 되지 않습니다 tmux.

스크립트는 원격 호스트 이름을 접두사와 일치시키고 에 대해 원하는 스타일을 선택합니다 tmux. 에 국한되지 않고 case원하는 방식으로 논리를 구축할 수 있습니다( 와의 정규식 일치를 포함 [[하지만 bash그 다음에는 shebang을 변경해야 함). 마지막에 스타일이 적용됩니다.

종료 후 ssh함수는 인수 없이 스크립트를 호출합니다. "$1"패턴과 일치하지 않는 빈 문자열로 평가되므로 기본 스타일이 default에 전달됩니다 tmux.


PermitLocalCommandLocalCommandin /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'

나는 그것이 꽤 우아하다고 생각합니다.

관련 정보