¿Cómo puede cambiar la línea de estado de la pantalla GNU según el nombre de host?

31

Tengo un directorio de inicio compartido que se monta automáticamente a través de NFS en todos los servidores UNIX en los que inicio sesión. Me gustaría tener un único .screenrc que (por ejemplo) coloque el nombre de host en la línea de estado duro en un color diferente para indicar cuándo estoy conectado a producción versus desarrollo; nuestros nombres de host son tales que esto se puede hacer fácilmente mediante el uso de la coincidencia de patrones.

¿Hay alguna forma de poner declaraciones condicionales en .screenrc? Un vistazo rápido a la página del manual no parece revelar nada obvio.

EDITAR:

Para aclarar, ya tengo una línea de estado duro personalizada; Quiero cambiar algunos de los colores / campos que se muestran en función del nombre de host en el que se invoca la pantalla. Ya tengo algo así para mi PS1, sin embargo, preferiría hacer esto en la línea de estado de la pantalla cuando salte de estos hosts a enrutadores / conmutadores, lo que no me permite hacer una coloración rápida. De esta forma, puedo tener una ventana para la producción y otra para el desarrollo, con el color de la línea de estado de la pantalla que me indica en cuál estoy de un vistazo.

Murali Suriar
fuente
¿Nombre de host de la máquina en la que se ejecuta la pantalla? ¿O está usando el nombre de host de esa 'ventana' de pantalla en particular?
Kyle Brandt
@Kyle: nombre de host de la máquina en la que se ejecuta la pantalla. Vea la pregunta actualizada para un poco más de detalle.
Murali Suriar

Respuestas:

13

Veo dos formas de hacer esto, la primera es hacer un archivo .screenrc por host.
Como .screenrc_serverA, .screenrc_serverB...
En su script de inicio de shell, configure SCREENRC en algo como .screenrc_`hostname`
Por supuesto, puede usar el comando de origen de la pantalla para incluir algo como .screenrc_defaulten cada archivo .screenrc_ ... personalizado para que solo contenga una línea de título / estado duro y no el configuración completa cada vez.

La segunda forma sería ejecutar comandos como screen -X hardstatus lastline ...(usando las pruebas if para ejecutar el comando con un valor diferente para ... dependiendo del nombre de host) en su script de inicio de shell. Cuando inicie sesión en el servidor, screen -X no hará nada porque la pantalla aún no se iniciará, pero cada vez que abra una nueva ventana en la pantalla, el estado duro se actualizará.

Por supuesto, la primera solución es mejor porque la segunda actualizará la línea de estado duro cada vez que abra una ventana de noticias, lo que probablemente sea inútil ya que el nombre de host no habrá cambiado.

radio
fuente
Cuando lees ".screenrc_hostname" lee ".screenrc_ hostname". Tengo un problema para incluir `en la publicación
radio
Agradable: me perdí la parte de la página del manual sobre la variable de entorno SCREENRC que se buscaba primero.
Murali Suriar
@radius Pude agregar backticks usando esta sugerencia: meta.stackexchange.com/a/70679/167351
Bruno Bronosky
16

@radius es acertado con lo de SCREENRC, pero no fue una respuesta muy completa, así que explicaré ...

~ / .bashrc

# Strip down a FQDN
hostname="$(hostname | sed 's/\..*//')"
# Use the case pattern for server groups
case "$hostname" in
    mario|luigi|toad|peach|koopa*|bowser) export SCREENRC=~/.screenrc_prod;;
    dev*|vm*)  export SCREENRC=~/.screenrc_dev;;
esac
# Use condensed bash "new test*" notation to override for specific servers
# e.g. ~/.screenrc_bowser would get used instead of ~/.screenrc_prod
[[ -f "~/.screenrc_$hostname" ]] && export SCREENRC="~/.screenrc_$hostname"

* ¡Utiliza siempre nuevas pruebas !

Una palabra sobre los personajes de escape

La forma correcta de incluir colores en los scripts es con tput, no con caracteres de escape. Sus caracteres de escape son específicos de su terminal. El comando tput es consciente del terminal. Escribí esto para cuando necesito ponerme elegante en mis scripts:

~ / bin / COLORS.sh

GT_RESET=$(   tput sgr0)  # Reset all attributes
GT_BRIGHT=$(  tput bold)  # Set “bright” attribute
GT_DIM=$(     tput dim)   # Set “dim” attribute (normal/non-bright)
GT_ULINE=$(   tput smul)  # Set “underscore” (underlined text) attribute
GT_BLINK=$(   tput blink) # Set “blink” attribute
GT_INVERSE=$( tput rev)   # Set “inverse” attribute
GT_HIDDEN=$(  tput invis) # Set “hidden” attribute

FG_BLACK=$(   tput setaf 0) #foreground to color #0 - black
FG_RED=$(     tput setaf 1) #foreground to color #1 - red
FG_GREEN=$(   tput setaf 2) #foreground to color #2 - green
FG_YELLOW=$(  tput setaf 3) #foreground to color #3 - yellow
FG_BLUE=$(    tput setaf 4) #foreground to color #4 - blue
FG_MAGENTA=$( tput setaf 5) #foreground to color #5 - magenta
FG_CYAN=$(    tput setaf 6) #foreground to color #6 - cyan
FG_WHITE=$(   tput setaf 7) #foreground to color #7 - white

BG_BLACK=$(   tput setab 0) #background to color #0 - black
BG_RED=$(     tput setab 1) #background to color #1 - red
BG_GREEN=$(   tput setab 2) #background to color #2 - green
BG_YELLOW=$(  tput setab 3) #background to color #3 - yellow
BG_BLUE=$(    tput setab 4) #background to color #4 - blue
BG_MAGENTA=$( tput setab 5) #background to color #5 - magenta
BG_CYAN=$(    tput setab 6) #background to color #6 - cyan
BG_WHITE=$(   tput setab 7) #background to color #7 - white

También hice un script para demostrar el uso de tput. Puedes obtenerlo de esta esencia.

Ver:
http://www.ibm.com/developerworks/aix/library/au-learningtput/?S_TACT=105AGY06
http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html

Bruno Bronosky
fuente
1
Encontré dos "inconsistencias". El primero es el hecho de que también setafse usa para el fondo , aunque debería ser setab( b en lugar de f ) y el segundo es que usarlo 9por defecto no funciona para mí, tal vez porque la versión tput no es estándar (tampoco en su caso o el mío, simplemente no lo sé y realmente no importa mucho)
Sombra
@Shadow gracias por atrapar eso. Lo corregí
Bruno Bronosky
5

Simplemente configúrelo en su .screenrc como la variable hardstatus. Siempre que use una variable como% H para el nombre de host, cambiará para coincidir con cualquier nombre de host en el que trabaje.

hardstatus alwayslastline "%{rk}%H %{gk}%c %{yk}%M%d %{wk}%?%-Lw%?%{bw}%n*%f %t%?(%u)%?%{wk}%?%+Lw%?"

Le dará una línea de estado en la parte inferior que se ve como

ejemplo de pantalla hardstatus

el nombre de host es rojo sobre negro, la hora es verde sobre negro, la fecha es amarilla sobre negro. La ventana marcada con * es la ventana actual, que se muestra en texto azul sobre fondo blanco. ventana marcada con - es la ventana activa anteriormente, que muestra texto blanco sobre negro. la ventana 1, arriba, no es actual ni anterior, y se mostraría en blanco sobre negro. las otras posibilidades le mostrarían otros usuarios adjuntos a ventanas, blanco sobre negro, y estarían marcados con +.

tener la visualización de la hora también ayuda a mantener vivo si ssh a servidores remotos para ejecutar la pantalla, ya que el tiempo que cambia cada minuto mantendrá viva su sesión, incluso si el shell está inactivo en el lado remoto.

Tim Kennedy
fuente
Eso no me permite formatear condicionalmente el nombre de host en función de su estructura (por ejemplo, cualquier nombre de host que termine en '-dev' en azul, cualquier nombre de host que termine en '-prod' en rojo.)
Murali Suriar
ah si solo las declaraciones if de screenrc admitían regex.
Tim Kennedy el
4

Puede colorear la línea de estado desde una secuencia de comandos de backtick imprimiendo \005{..r}o similar ( rpara rojo, etc., como dentro de .screenrcsí mismo), para que pueda cambiar el nombre del host para llegar a un número, o simplemente tener un conjunto de declaraciones condicionales para establecer el color. Como ejemplo, aquí hay un script para cambiar el color e imprimir el nombre de host para usar dentro de la pantalla:

#!/bin/bash
Red="\005{..r}"
Yellow="\005{..y}"
Green="\005{..g}"
Blue="\005{..b}"
Magenta="\005{..m}"
Cyan="\005{..c}"
White="\005{..w}"

case "$HOSTNAME" in
   lubuntu-eee)
      echo -e "$Magenta$HOSTNAME"
      ;;
   ubuntu-pc)
      echo -e "$Magenta$HOSTNAME"
      ;;
   *)
      echo -e "$Green$HOSTNAME"
esac

Luego agrega una entrada para este script al .screenrcy referencia dentro del hardstatus o el título como% 4`:

backtick 4 3600 3600 /usr/local/bin/screen_hostname
caption always "%{.kc}%D %d.%m.%Y %=%{.kg} %4` %{.kc}%0c"

Esto supone que es poco probable que cambie el nombre de host, por lo tanto, el tiempo de espera y la validez de 1 hora (3600 segundos); los bits que rodean la llamada al backtick en sí solo ponen la fecha al comienzo de la línea y la hora después del nombre de host.

Incluso puede usar este mecanismo para colorear la salida de un script en función del valor del nivel de carga de la batería, la carga del sistema o la temperatura, suponiendo que tenga acceso a los valores relevantes desde un script de shell.

Dominic Watkins
fuente
+1 por mencionar el screenescape \005: de esa manera, todo el formato condicional se puede colocar en un script de shell mucho más legible en lugar de aquellos que ya son difíciles de analizar caption. hardstatusdirectivas de pantalla.
ckujau
1

Si desea evitar muchos scripts, puede intentar esto:

backtick 5 99999 99999 grep prod /etc/hostname
caption always "%?%{.R.}%5`%:%H%?"

grep solo imprimirá el nombre de host si coincide con "prod", por lo que puede conectarlo a un backtick y la %?construcción. ¡Viola!

Neal Fultz
fuente