Si ingreso a un servidor remoto desde tmux en un solo panel, ¿es posible cambiar el color de fondo del panel según el nombre del servidor?
Digamos que todos mis servidores de producción comienzan con prod_XYZ
y un servidor de desarrollo comienza con dev_XYZ.
Si entro en estos dos servidores, ¿puedo colorearlos de manera diferente según el tipo de servidor en el que estoy? Es decir, ¿según el prefijo del servidor?
Respuesta1
Si entro a estos dos servidores, ¿puedo colorearlos de manera diferente según el tipo de servidor en el que estoy?
Sí.
Mi solución básica requiere un contenedor para ssh
(puede ser una función de shell o un script), además de un script auxiliar adicional.
La función contenedora debería ser así:
ssh() {
helper="$HOME/bin/_ssh_tmux_background"
command ssh \
-o PermitLocalCommand=yes \
-o LocalCommand="'$helper' '%h'" \
"$@"
"$helper"
}
Y este es el script de ayuda:
#/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"
Guarde el script donde $helper
apunta la función ( $HOME/bin/_ssh_tmux_background
en mi código), hágalo ejecutable.
Ahora, si invoca ssh
, la función ejecutará el ssh
comando real con dos opciones adicionales: PermitLocalCommand
y LocalCommand
(consulte man 5 ssh_config
para obtener más detalles). De esta manera, ejecutará el script auxiliar con el nombre del host remoto como único argumento tan pronto como inicie sesión en el host remoto.
Si estás en tmux
, el script heredará la TMUX_PANE
variable de entorno. El script saldrá inmediatamente si está fuera de tmux
, por lo que no debería interferir incluso si usa la función sin tmux
.
El script compara el nombre del host remoto con sus prefijos y elige el estilo deseado para tmux
. No está limitado a case
, puede construir su lógica de la forma que desee (incluida la coincidencia de expresiones regulares con [[
, pero luego necesita bash
cambiar el asunto). Al final se aplica el estilo.
Después de ssh
salir, la función llama al script sin argumentos. "$1"
se evalúa como una cadena vacía que no coincide con ninguno de nuestros patrones, por lo que el estilo predeterminado de default
se pasa a tmux
.
Tenga en cuenta que puede especificar PermitLocalCommand
y LocalCommand
en /etc/ssh/ssh_config
o en ~/.ssh/config
. Sin embargo, no puede deshacerse del contenedor tan fácilmente porque necesita cambiar el color de fondo nuevamente después de ssh
salir.
Aún así, es posible que se desee una solución sin envoltorio. Imagine un script (invocado con LocalCommand
) que recupera el PID de su padre ( ssh
's), se bifurca al fondo (así ssh
continúa), monitorea el PID y restaura tmux
la configuración después de ssh
las salidas. Tal guión podríaahorrarel estilo original del panel, sin importar cuál fuera, y restaurarlo más tarde, en lugar de usar el default
estilo.
Vamos a hacerlo. Este es mi intento:
#/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" ) &
El nuevo script (digamos $HOME/bin/_ssh_tmux_style
) también debería ser ejecutable. Utiliza tail --pid
lo que no es portátil; veresta preguntapara enfoques alternativos.
Ahora no necesitamos la antigua función contenedora (así que inicie un nuevo shell o unset -f ssh
). Todo lo que necesitamos es ~/.ssh/config
. Recuerda man 5 ssh_config
dice:
Dado que se utiliza el primer valor obtenido para cada parámetro, se deben proporcionar más declaraciones específicas del host cerca del principio del archivo y los valores predeterminados generales al final.
Teniendo esto en cuenta, coloque lo siguiente en el lugar correcto de su ~/.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'
Las comillas dobles son importantes. Tenga en cuenta que toda la configuración adicional (estilos) ahora está integrada en la configuración de ssh
. Haz tu $PATH
contenido $HOME/bin
y luego se pone aún mejor:
LocalCommand=_ssh_tmux_style 'bg=red'
Lo encuentro bastante elegante.