Comment pouvez-vous changer la ligne d'état de l'écran GNU en fonction du nom d'hôte?

31

J'ai un répertoire personnel partagé qui est monté automatiquement via NFS sur tous les serveurs UNIX auxquels je me connecte. Je voudrais avoir un seul .screenrc qui (par exemple) place le nom d'hôte dans la ligne hardstatus dans une couleur différente pour indiquer quand je suis connecté à la production par rapport au développement; nos noms d'hôtes sont tels que cela peut facilement être fait grâce à l'utilisation de la correspondance de modèles.

Existe-t-il un moyen de mettre des instructions conditionnelles dans .screenrc? Un rapide aperçu de la page de manuel ne semble rien révéler d'évident.

MODIFIER:

Pour clarifier, j'ai déjà une ligne d'état dur personnalisée; Je souhaite modifier certains des coloris / champs affichés en fonction du nom d'hôte sur lequel l'écran est invoqué. J'ai déjà quelque chose comme ça pour ma PS1, mais je préfère le faire dans la ligne d'état de l'écran lorsque je saute de ces hôtes aux routeurs / commutateurs, ce qui ne me permet pas de coloriser rapidement. De cette façon, je peux avoir une fenêtre pour la production et une pour le développement, la couleur de la ligne d'état de l'écran me disant sur laquelle je suis en un coup d'œil.

Murali Suriar
la source
Nom d'hôte de la machine sur laquelle cet écran fonctionne? Ou le nom d'hôte de cette «fenêtre» d'écran particulière utilise-t-il?
Kyle Brandt
@Kyle: nom d'hôte de la machine sur laquelle cet écran s'exécute. Voir la question mise à jour pour un peu plus de détails.
Murali Suriar

Réponses:

13

Je vois deux façons de le faire, la première consiste à créer un fichier .screenrc par hôte.
Comme .screenrc_serverA, .screenrc_serverB...
dans votre jeu screenrc à quelque chose comme script de démarrage du shell .screenrc_`hostname`
Bien sûr , vous pouvez utiliser la commande source de l' écran pour inclure quelque chose comme .screenrc_defaultdans chaque .screenrc_ personnalisé ... les fichiers afin qu'ils ne contiennent une ligne de légende / hardstatus et non la configuration entière à chaque fois.

La deuxième façon serait d'exécuter des commandes comme screen -X hardstatus lastline ...(en utilisant des tests if pour exécuter la commande avec une valeur différente pour ... selon le nom d'hôte) dans votre script de démarrage du shell. Lorsque vous vous connecterez au serveur, screen -X ne fera rien car screen ne sera pas encore lancé, mais chaque fois que vous ouvrirez une nouvelle fenêtre dans screen, le hardstatus sera mis à jour.

Bien sûr, la 1ère solution est meilleure car la seconde actualisera la ligne hardstatus chaque fois que vous ouvrirez une fenêtre de news ce qui est probablement inutile car le nom d'hôte n'aura pas changé.

rayon
la source
Lorsque vous lisez ".screenrc_hostname", lisez ".screenrc_ hostname". J'ai eu un problème pour inclure `dans le post
rayon
Nice - J'ai raté la partie de la page de manuel sur la variable d'environnement SCREENRC recherchée en premier.
Murali Suriar
@radius J'ai pu ajouter des backticks en utilisant cette suggestion: meta.stackexchange.com/a/70679/167351
Bruno Bronosky
16

@radius est parfait avec le truc SCREENRC, mais ce n'était pas une réponse très complète, donc je vais élaborer…

~ / .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"

* Utilisez toujours de nouveaux tests !

Un mot sur les personnages d'échappement

La bonne façon d'inclure des couleurs dans les scripts est d'utiliser tput et non des caractères d'échappement. Vos personnages d'échappement sont spécifiques à votre terminal. La commande tput est compatible avec le terminal. J'ai écrit ceci quand j'ai besoin de me faire plaisir dans mes 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

J'ai également fait un script pour démontrer l'utilisation de tput. Vous pouvez l'obtenir à partir de cet essentiel.

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

Bruno Bronosky
la source
1
J'ai trouvé deux "incohérences". Le premier est le fait que l’arrière setaf- plan est également utilisé, bien qu’il devrait l'être setab( b au lieu de f ) et le second que l'utilisation 9par défaut ne fonctionne pas pour moi, peut-être parce que la version tput n'est pas standard (soit dans son cas ou le mien, je ne sais tout simplement pas et ça n'a pas vraiment d'importance)
Shadow
@Shadow merci d'avoir attrapé ça. Je l'ai corrigé.
Bruno Bronosky
5

Il suffit de le définir dans votre .screenrc comme variable hardstatus. Tant que vous utilisez une variable comme% H pour le nom d'hôte, elle changera pour correspondre à tout nom d'hôte sur lequel vous travaillez.

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

Vous donnera une ligne d'état en bas qui ressemble à

exemple d'écran hardstatus

le nom d'hôte est rouge sur noir, l'heure est verte sur noir, la date est jaune sur noir. la fenêtre marquée d'un * est la fenêtre actuelle, affichée en texte bleu sur fond blanc. la fenêtre marquée par - est la fenêtre précédemment active, avec du texte blanc sur noir. la fenêtre 1, ci-dessus, n'est ni actuelle ni précédente, et serait affichée en blanc sur noir. les autres possibilités vous montreraient d'autres utilisateurs attachés aux fenêtres, blanc sur noir, et seraient marqués par +.

l'affichage de l'heure aide également à garder la vie active si vous utilisez des serveurs distants pour exécuter l'écran, car le changement d'heure chaque minute gardera votre session active, même si le shell est inactif du côté distant.

Tim Kennedy
la source
Cela ne me permet pas de formater conditionnellement le nom d'hôte en fonction de sa structure (par exemple, tout nom d'hôte se terminant par '-dev' en bleu, tout nom d'hôte se terminant par '-prod' en rouge.)
Murali Suriar
ah. si seulement les instructions if de screenrc supportaient l'expression régulière.
Tim Kennedy
4

Vous pouvez colorer la ligne d'état à partir d'un script de backtick en l'imprimant \005{..r}ou similaire ( rpour le rouge, etc. comme dans le .screenrclui - même), vous pouvez donc soit hacher le nom d'hôte pour arriver à un nombre, soit simplement avoir un tas d'instructions conditionnelles à définir la couleur. À titre d'exemple, voici un script pour changer la couleur et imprimer le nom d'hôte à utiliser dans l'écran:

#!/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

Vous ajoutez ensuite une entrée pour ce script à la .screenrcet la référencez dans le hardstatus ou la légende en tant que% 4`:

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

Cela suppose que le nom d'hôte est peu susceptible de changer, d'où le délai d'expiration et la validité de 1 heure (3600 secondes); les bits entourant l'appel au backtick lui-même viennent de mettre la date au début de la ligne et l'heure après le nom d'hôte.

Vous pouvez même utiliser ce mécanisme pour colorer la sortie d'un script en fonction de la valeur du niveau de charge de la batterie, de la charge du système ou de la température, en supposant que vous ayez accès aux valeurs pertinentes à partir d'un script shell.

Dominic Watkins
la source
+1 pour mentionner l' screenévasion \005- de cette façon, tout le formatage conditionnel peut être mis dans un script shell beaucoup plus lisible au lieu de ceux déjà difficiles à analyser captionresp. hardstatusdirectives d'écran.
ckujau
1

Si vous voulez éviter beaucoup de scripts, vous pouvez essayer ceci:

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

grep n'imprimera le nom d'hôte que s'il correspond à "prod", vous pouvez donc le brancher à un backtick et à la %?construction. Alto!

Neal Fultz
la source