Изменить цвет фона панели tmux в зависимости от имени удаленного хоста

Изменить цвет фона панели tmux в зависимости от имени удаленного хоста

Если я подключаюсь по ssh к удаленному серверу из tmux в одной панели, можно ли изменить цвет фона панели в зависимости от имени сервера?

Допустим, все мои prod-серверы начинаются с , prod_XYZа dev-сервер начинается с 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в /etc/ssh/ssh_configили в ~/.ssh/config. Однако вы не сможете так просто избавиться от оболочки, поскольку вам нужно будет снова изменить цвет фона после sshвыхода.

Тем не менее, решение без обертки может быть желательным. Представьте себе скрипт (вызываемый с помощью LocalCommand), который извлекает PID своего родителя ( ssh's), переходит в фоновый режим (и 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. Remember 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. Сделайте свой $PATHcontain $HOME/bin, и тогда это станет еще лучше:

LocalCommand=_ssh_tmux_style 'bg=red'

Я нахожу это весьма элегантным.

Связанный контент