Comment changer automatiquement l'arrière-plan du terminal, en fonction du nom d'hôte ssh?

9

Comment changer progressivement la couleur d'arrière-plan d'une fenêtre de terminal, en fonction du nom d'hôte dans lequel vous utilisez ssh?

c'est-à-dire lorsque je suis connecté à des systèmes embarqués en direct sur du matériel de production, je souhaite que l'arrière-plan du terminal passe au rouge - pour "rester informé" du serveur sur lequel je suis. Avoir juste le nom d'hôte dans PS1 n'est pas toujours suffisant.

J'utilise gnome-terminal, mais accepterais toute solution viable sous Linux.

Mtl Dev
la source

Réponses:

7

Vous pouvez utiliser le ssh LocalCommand pour émettre la séquence d'échappement ANSI pour changer la couleur d'arrière-plan et avoir une section par hôte (ou modèle d'hôte) pour sélectionner la couleur appropriée que vous souhaitez faire correspondre à l'hôte distant.

Si vos serveurs de production suivent une convention de dénomination telle que "commence par prod", vous pouvez essayer l'extrait de code suivant dans votre fichier ~ / .ssh / config: Host prod* PermitLocalCommand yes LocalCommand printf "\x1b[41m\x1b[2JPRODUCTION SYSTEM [%n]\n\n"

S'il n'y a pas de convention de dénomination pratique pour utiliser des modèles génériques, vous pouvez simplement répertorier les noms d'hôtes séparés par des espaces. Vous pouvez également créer des blocs hôtes supplémentaires avec différentes valeurs de couleur et chaînes pour divers autres serveurs hors production.

Après la connexion à un hôte qui correspond au motif, le printf correspondant sera exécuté localement, en changeant la couleur d'arrière-plan en rouge (le [41m choisit le rouge comme couleur d'arrière-plan, la partie [2J repeint tout l'écran avec la couleur d'arrière-plan mise à jour. Voir https://en.wikipedia.org/wiki/ANSI_escape_code pour beaucoup plus d'options)

Le plus gros inconvénient de cette approche est que la couleur d'arrière-plan persiste à la sortie de la session ssh; Il n'y a pas d'équivalent à LocalCommand à exécuter sur la déconnexion (à ma connaissance). Un script d'alias ou de shell shell pour ssh pourrait être appelé printf "\x1b[0m"comme réinitialisation. D'un autre côté, avoir la couleur d'arrière-plan définie via LocalCommand signifie que vous obtiendrez l'ensemble de couleurs même si ssh n'est pas exécuté via un script wrapper ou un alias.

PKapp
la source
Excellente réponse! Le seul problème que je vois, qui est cependant important, est que le changement de couleur reste pour le premier "écran" uniquement. Dès que les commandes sont entrées et que l'écran défile vers le haut, il passe du rouge au noir. Peut-être que le contrôle des couleurs du terminal gnome remplace la séquence d'échappement ANSI? Connaissez-vous une solution de contournement?
Mtl Dev
Est-il possible de faire quelque chose de similaire, peut-être à la variable d'invite PS1 sur l'hôte SSH?
Mtl Dev
La réinitialisation peut être provoquée par des séquences dans votre variable d'invite PS1, ou si vous avez des commandes comme lsaliasées ls --color=autoet qu'elles incluent la séquence de réinitialisation '<ESC> [0m'. Pour persister, vous devrez probablement configurer différents profils gnome-terminal et suivre la route du script wrapper, en sélectionnant un nom de profil basé sur le nom d'hôte et en invoquantgnome-terminal --profile=$PROFILE_NAME -e ssh $HOST &
PKapp
Vous avez tout à fait raison: si j'ai ls --colourOU la séquence de réinitialisation dans PS1, l'un ou l'autre remplacera les paramètres de couleur ansi précédents. Je vais donc examiner la mise en œuvre de la solution de script wrapper que vous proposez, ce qui est également une excellente idée! Merci beaucoup!
Mtl Dev
Juste pour que les autres le sachent: l'ajout de printf à ~ / .ssh / config semble interrompre rsync. Détails connexes ici: serverfault.com/questions/267154/…
Mtl Dev