Если я подключаюсь по 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
. Сделайте свой $PATH
contain $HOME/bin
, и тогда это станет еще лучше:
LocalCommand=_ssh_tmux_style 'bg=red'
Я нахожу это весьма элегантным.