Cambie el color de fondo del panel tmux según el nombre del host remoto

Cambie el color de fondo del panel tmux según el nombre del host remoto

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_XYZy 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 $helperapunta la función ( $HOME/bin/_ssh_tmux_backgrounden mi código), hágalo ejecutable.

Ahora, si invoca ssh, la función ejecutará el sshcomando real con dos opciones adicionales: PermitLocalCommandy LocalCommand(consulte man 5 ssh_configpara 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_PANEvariable 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 bashcambiar el asunto). Al final se aplica el estilo.

Después de sshsalir, 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 defaultse pasa a tmux.


Tenga en cuenta que puede especificar PermitLocalCommandy LocalCommanden /etc/ssh/ssh_configo en ~/.ssh/config. Sin embargo, no puede deshacerse del contenedor tan fácilmente porque necesita cambiar el color de fondo nuevamente después de sshsalir.

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í sshcontinúa), monitorea el PID y restaura tmuxla configuración después de sshlas 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 defaultestilo.

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 --pidlo 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_configdice:

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 $PATHcontenido $HOME/biny luego se pone aún mejor:

LocalCommand=_ssh_tmux_style 'bg=red'

Lo encuentro bastante elegante.

información relacionada