Comment faire pour que le jeu de couleurs de la fenêtre du terminal Apple change automatiquement lorsque je ssh sur un serveur spécifique

StackOverflow https://stackoverflow.com/questions/157959

  •  03-07-2019
  •  | 
  •  

Question

Lorsque je me connecte à un serveur de production distant, j'aimerais que le jeu de couleurs de la fenêtre de mon terminal prenne une teinte éclatante et effrayante, de préférence rouge, pour m'avertir que je touche un serveur effrayant en direct.

Comment puis-je faire en sorte qu'il détecte automatiquement que j'ai ssh'ed quelque part, et si cela se trouve quelque part dans une liste spécifique, modifiez le schéma de couleurs?

Je veux mettre à jour le schéma de Terminal.app, je ne sais pas comment je ferais cela dans un env. linux / unix pur

Était-ce utile?

La solution

Mettez le script suivant dans ~ / bin / ssh (assurez-vous que ~ / bin / est examiné avant / usr / bin / dans votre PATH) :

#!/bin/sh

HOSTNAME=`echo $@ | sed s/.*@//`

set_bg () {
  osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"
}

on_exit () {
  set_bg "{0, 0, 0, 50000}"
}
trap on_exit EXIT

case $HOSTNAME in
  production1|production2|production3) set_bg "{45000, 0, 0, 50000}" ;;
  *) set_bg "{0, 45000, 0, 50000}" ;;
esac

/usr/bin/ssh "$@"

Le script ci-dessus extrait le nom d'hôte de la ligne "" username @ host". (cela suppose que vous vous connectiez à des hôtes distants avec "ssh user @ host").

Ensuite, en fonction du nom d'hôte, il définit un arrière-plan rouge (pour les serveurs de production) ou vert (pour tous les autres). En conséquence, toutes vos fenêtres SSH auront un arrière-plan coloré.

Je suppose ici que votre arrière-plan par défaut est le noir. Le script rétablit la couleur d'arrière-plan lorsque vous vous déconnectez du serveur distant (voir la section "Trap on_exit").

Notez cependant que ce script ne suit pas la chaîne de connexions SSH d'un hôte à un autre. En conséquence, l'arrière-plan sera vert si vous vous connectez d'abord au serveur de test, puis à la production depuis ce dernier.

Autres conseils

Une fonctionnalité moins connue de Terminal est que vous pouvez définir le nom d'un profil de paramètres sur un nom de commande. Ce profil sera sélectionné lors de la création d'un nouveau terminal via Shell > Nouvelle commande… ou Shell > Nouvelle connexion à distance… .

Par exemple, dupliquez votre profil par défaut, nommez-le «ssh» et définissez sa couleur d'arrière-plan sur rouge. Ensuite, utilisez Nouvelle commande… pour exécuter ssh host.example.com .

Il correspond également aux arguments, vous pouvez donc lui demander de choisir différents paramètres pour différents hôtes distants, par exemple.

Voici une solution combinée basée sur quelques réponses existantes qui gère la sortie. Inclut également un petit plus si vous ne voulez pas gérer les valeurs de couleur 16 bits.

Ceci devrait être mis dans votre ~ / .bash_profile

# Convert 8 bit r,g,b,a (0-255) to 16 bit r,g,b,a (0-65535)
# to set terminal background.
# r, g, b, a values default to 255
set_bg () {
    r=${1:-255}
    g=${2:-255}
    b=${3:-255}
    a=${4:-255}

    r=$(($r * 256 + $r))
    g=$(($g * 256 + $g))
    b=$(($b * 256 + $b))
    a=$(($a * 256 + $a))

    osascript -e "tell application \"Terminal\" to set background color of window 1 to {$r, $g, $b, $a}"
}

# Set terminal background based on hex rgba values
# r,g,b,a default to FF
set_bg_from_hex() {
    r=${1:-FF}
    g=${2:-FF}
    b=${3:-FF}
    a=${4:-FF}

    set_bg $((16#$r)) $((16#$g)) $((16#$b)) $((16#$s))
}

# Wrapping ssh command with extra functionality
ssh() {
    # If prod server of interest, change bg color
    if ...some check for server list
    then
        set_bg_from_hex 6A 05 0C
    end

    # Call original ssh command
    if command ssh "$@"
    then
        # on exit change back to your default
        set_bg_from_hex 24 34 52
    fi
}
  • set_bg - prend 4 valeurs de couleur (8 bits)
  • set_bg_from_hex - prend 4 valeurs hexadécimales. la plupart de mes références de couleurs que j'utilise sont en hexadécimal, donc cela me facilite la tâche. Cela pourrait aller encore plus loin dans l'analyse de #RRGGBB au lieu de RR GG BB, mais cela fonctionne bien pour moi.
  • ssh - encapsule la commande ssh par défaut avec la logique personnalisée de votre choix. L’instruction if est utilisée pour gérer la sortie et réinitialiser la couleur d’arrière-plan.

Combinaison de réponses 1 et 2 ont les caractéristiques suivantes:

Créez le fichier ~ / bin / ssh comme décrit dans 1 avec le contenu suivant:

#!/bin/sh
# https://stackoverflow.com/a/39489571/1024794
log(){
  echo "$*" >> /tmp/ssh.log
}
HOSTNAME=`echo $@ | sed s/.*@//`
log HOSTNAME=$HOSTNAME
# to avoid changing color for commands like `ssh user@host "some bash script"`
# and to avoid changing color for `git push` command:
if [ $# -gt 3 ] || [[ "$HOSTNAME" = *"git-receive-pack"* ]]; then
  /usr/bin/ssh "$@"
  exit $? 
fi

set_bg () {
  if [ "$1" != "Basic" ]; then
    trap on_exit EXIT;
  fi
  osascript ~/Dropbox/macCommands/StyleTerm.scpt "$1"
}

on_exit () {
  set_bg Basic
}


case $HOSTNAME in
  "178.222.333.44 -p 2222") set_bg "Homebrew" ;;
  "178.222.333.44 -p 22") set_bg "Ocean" ;;
  "192.168.214.111") set_bg "Novel" ;;
  *) set_bg "Grass" ;;
esac

/usr/bin/ssh "$@"

Rendez-le exécutable: chmod + x ~ / bin / ssh .

Le fichier

~ / Dropbox / macCommands / StyleTerm.scpt a le contenu suivant:

#https://superuser.com/a/209920/195425
on run argv
  tell application "Terminal" to set current settings of selected tab of front window to first settings set whose name is (item 1 of argv)
end run

Les mots Basic, Homebrew, Ocean, Novel, Grass proviennent des paramètres du terminal mac os cmd , : profils de terminal

Vous pouvez définir la variable $ PS1 dans votre .bashrc.

red='\e[0;31m'
PS1="$\[${red}\]"

EDIT:   Pour ce faire, ouvrez le terminal. Puis dites

#touch .bashrc

Vous pouvez ensuite ouvrir .bashrc dans textEdit ou dans TextWrangler et ajouté. les commandes précédentes.

Une autre solution consiste à définir les couleurs droites dans le fichier de configuration ssh:

dans ~ / .ssh / config

Host Server1
   HostName x.x.x.x
   User ubuntu
   IdentityFile ~/Desktop/keys/1.pem
   PermitLocalCommand yes
   LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {27655, 0, 0, -16373}"

Host Server2
   HostName x.x.x.x
   User ubuntu
   IdentityFile ~/Desktop/keys/2.pem
   PermitLocalCommand yes
   LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {37655, 0, 0, -16373}"

Les terminaux Unix compatibles Xterm ont des séquences d'échappement standard pour définir les couleurs d'arrière-plan et de premier plan. Je ne suis pas sûr si Terminal.app les partage; il devrait.

case $HOSTNAME in
    live1|live2|live3) echo -e '\e]11;1\a' ;;
    testing1|testing2) echo -e '\e]11;2\a' ;;
esac

Le deuxième numéro spécifie la couleur souhaitée. 0 = par défaut, 1 = rouge, 2 = vert, etc. Ainsi, cet extrait de code, lorsqu'il est placé dans un fichier .bashrc partagé, vous donnera un arrière-plan rouge sur les serveurs en direct et un arrière-plan vert sur ceux en test. Vous devez également ajouter quelque chose comme ceci pour réinitialiser l’arrière-plan lorsque vous vous déconnectez.

on_exit () {
    echo -e '\e]11;0\a'
}
trap on_exit EXIT

MODIFIER: Google a trouvé un moyen de définir la couleur d'arrière-plan à l'aide d'AppleScript . Évidemment, cela ne fonctionne que s’il est exécuté sur le même ordinateur que Terminal.app. Vous pouvez contourner ce problème avec quelques fonctions d'emballage:

set_bg_color () {
    # color values are in '{R, G, B, A}' format, all 16-bit unsigned integers (0-65535)
    osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"
}

sshl () {
    set_bg_color "{45000, 0, 0, 50000}"
    ssh "$@"
    set_bg_color "{0, 0, 0, 50000}"
}

Vous devez vous rappeler d’exécuter sshl au lieu de ssh lors de la connexion à un serveur actif. Une autre option consiste à écrire une fonction wrapper pour ssh qui analyse ses arguments pour rechercher les noms d’hôte actifs connus et définit l’arrière-plan en conséquence.

Pourquoi ne pas simplement changer l'invite du shell chaque fois que vous êtes connecté via SSH? Il existe généralement des variables de shell spécifiques: SSH_CLIENT , SSH_CONNECTION , SSH_TTY

Définissez les couleurs du terminal dans le /. bashrc du serveur

du serveur.

J'avais besoin de la même chose, de quelque chose pour me faire savoir que j'étais sur un serveur de transfert ou de production et non dans mon environnement de développement, ce qui peut être très difficile à dire, en particulier dans une console Ruby ou quelque chose du genre.

Pour ce faire, j'ai utilisé la commande setterm du fichier ~. / bashrc de mon serveur afin d'inverser les couleurs du terminal lors de la connexion et de les restaurer lors de la fermeture.

~ / .bashrc

# Inverts console colours so that we know that we are in a remote server. 
# This is very important to avoid running commands on the server by accident.
setterm --inversescreen on

# This ensures we restore the console colours after exiting.
function restore_screen_colours {
  setterm --inversescreen off
}
trap restore_screen_colours EXIT

Je l'ai ensuite placé dans tous les fichiers ~ / .bashrc de tous les serveurs afin que je sache si mon terminal se trouve ou non sur un serveur distant.

Un autre avantage est que tout membre de votre équipe de développement ou de développement en tire profit sans en faire partie intégrante du processus d'intégration.

Fonctionne très bien.

Vous devez modifier la couleur du nom d'utilisateur et du nom de la machine hôte.

ajoutez la ligne suivante à votre fichier ~ / .bash_profile :

export PS1=" \[\033[34m\]\u@\h \[\033[33m\]\w\[\033[31m\]\[\033[00m\] $ "

La première partie (couleur violette) est ce que vous recherchez.

Aperçu: entrer la description de l'image ici

Ce sont mes couleurs préférées. Vous pouvez personnaliser chaque partie de la couleur de l'invite en modifiant les codes m (par exemple, 34 m ), qui sont des codes de couleur ANSI.

Liste des codes de couleur ANSI:

  • Noir: 30m
  • rouge: 31 m
  • Vert: 32m
  • Jaune: 33m
  • Bleu: 34m
  • Violet: 35 m
  • cyan: 36 m
  • Blanc: 37m
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top