Come faccio a cambiare automaticamente la combinazione di colori della finestra del terminale Apple quando ssh a un server specifico

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

  •  03-07-2019
  •  | 
  •  

Domanda

Quando mi immetto in un server di produzione remoto vorrei che la combinazione di colori della finestra del mio terminale cambiasse in qualcosa di luminoso e spaventoso, preferibilmente rosso, per avvertirmi che sto toccando un server spaventoso dal vivo.

Come posso fare in modo che rilevi automaticamente che ho scritto da qualche parte, e se quello da qualche parte è su un elenco specifico, cambiare la combinazione di colori?

Voglio aggiornare lo Schema di Terminal.app, non so come lo farei in un puro ambiente Linux / Unix

È stato utile?

Soluzione

Inserisci il seguente script in ~ / bin / ssh (assicurati che ~ / bin / abbia guardato / usr / bin / nel tuo PERCORSO) :

#!/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 "$@"

Lo script sopra estrae il nome host dalla riga " nomeutente @ host " (presuppone che accedi agli host remoti con " ssh user @ host ").

Quindi, a seconda del nome host, imposta uno sfondo rosso (per i server di produzione) o uno sfondo verde (per tutti gli altri). Di conseguenza tutte le finestre ssh saranno con sfondo colorato.

Suppongo che il tuo sfondo predefinito sia nero, quindi lo script ripristina il colore di sfondo in nero quando esci dal server remoto (vedi " trap on_exit ").

Nota, tuttavia, questo script non tiene traccia della catena di accessi ssh da un host all'altro. Di conseguenza, lo sfondo sarà verde nel caso in cui si acceda prima al server di prova, quindi si acceda alla produzione da esso.

Altri suggerimenti

Una caratteristica meno nota di Terminale è che puoi impostare il nome di un profilo di impostazioni su un nome di comando e selezionerà quel profilo quando crei un nuovo terminale tramite Shell > Nuovo comando & # 8230; o Shell > Nuova connessione remota & # 8230; .

Ad esempio, duplica il tuo profilo predefinito, chiamalo & # 8220; ssh & # 8221; e imposta il colore di sfondo su rosso. Quindi usa Nuovo comando & # 8230; per eseguire ssh host.example.com .

Corrisponde anche agli argomenti, quindi è possibile scegliere diverse impostazioni per host remoti diversi, ad esempio.

Ecco una soluzione combinata basata su un paio di risposte esistenti che gestisce l'uscita. Include anche un piccolo extra se non si desidera gestire valori di colore a 16 bit.

Questo dovrebbe essere inserito nel tuo ~/.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 - accetta 4 (8 bit) valori di colore
  • set_bg_from_hex - accetta 4 valori esadecimali. la maggior parte dei miei riferimenti di colore che uso sono in esadecimale, quindi questo mi rende più semplice. Si potrebbe fare un ulteriore passo per analizzare effettivamente #RRGGBB anziché RR GG BB, ma funziona bene per me.
  • ssh: racchiude il comando ssh predefinito con la logica personalizzata desiderata. L'istruzione if viene utilizzata per gestire l'uscita per ripristinare il colore di sfondo.

Combinazione di risposte 1 e 2 hanno il seguente:

Crea il file ~ / bin / ssh come descritto in 1 con il seguente contenuto:

#!/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 "$@"

Renderlo eseguibile: chmod + x ~ / bin / ssh .

Il file ~ / Dropbox / macCommands / StyleTerm.scpt ha il seguente contenuto:

#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

Le parole Basic, Homebrew, Ocean, Novel, Grass provengono dalle impostazioni del terminale mac os cmd , : profili terminali

Puoi impostare la variabile $ PS1 nel tuo .bashrc.

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

EDIT:   Per fare ciò aprire il Terminale. Quindi dire

#touch .bashrc

Puoi quindi aprire .bashrc in textEdit o in TextWrangler e aggiungere i comandi precedenti.

Un'altra soluzione è impostare lo stretto dei colori nel file di configurazione ssh:

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

I terminali Unix compatibili con Xterm hanno sequenze di escape standard per l'impostazione dei colori di sfondo e di primo piano. Non sono sicuro che Terminal.app li condivida; dovrebbe.

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

Il secondo numero specifica il colore desiderato. 0 = predefinito, 1 = rosso, 2 = verde, ecc. Quindi questo frammento, quando inserito in un .bashrc condiviso, ti darà uno sfondo rosso sui server attivi e uno verde su quelli di prova. Dovresti anche aggiungere qualcosa di simile per ripristinare lo sfondo quando esci.

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

EDIT: Google ha trovato un modo per impostare il colore di sfondo usando AppleScript . Ovviamente, questo funziona solo se eseguito sullo stesso computer di Terminal.app. Puoi aggirare questo con un paio di funzioni wrapper:

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}"
}

Dovresti ricordare di eseguire sshl invece di ssh quando ti connetti a un server live. Un'altra opzione è scrivere una funzione wrapper per ssh che scansiona i suoi argomenti per nomi host live noti e imposta lo sfondo di conseguenza.

Perché non modificare semplicemente il prompt della shell ogni volta che si è effettuato l'accesso tramite SSH? Di solito ci sono variabili shell specifiche: SSH_CLIENT , SSH_CONNECTION , SSH_TTY

Imposta i colori dei terminali nel /.bashrc del server

Avevo bisogno della stessa cosa, qualcosa per farmi sapere che ero su un server di gestione temporanea o di produzione e non nel mio ambiente di sviluppo, il che può essere molto difficile da dire, soprattutto quando si è su una console Ruby o qualcosa del genere.

Per raggiungere questo obiettivo, ho usato il comando setterm nel file ~. / bashrc del mio server per invertire i colori del terminale durante la connessione e ripristinare i colori all'uscita.

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

L'ho quindi inserito in tutti i file ~ / .bashrc dei server in modo da sapere quando il mio terminale si trova su un server remoto o meno.

Un altro vantaggio è che qualsiasi membro del tuo team di sviluppo o devops ne trae vantaggio senza renderlo parte del processo di onboarding.

Funziona alla grande.

Dovresti cambiare il colore del nome utente e del nome della macchina host.

aggiungi la seguente riga al tuo file ~ / .bash_profile :

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

La prima parte (di colore viola) è ciò che stai cercando.

Anteprima: inserisci qui la descrizione dell'immagine

Questi sono i miei colori preferiti. Puoi personalizzare ogni parte del colore del prompt modificando i codici m (ad es. 34m ) che sono codici colore ANSI.

Elenco dei codici colore ANSI:

  • Nero: 30m
  • Rosso: 31m
  • Verde: 32m
  • Giallo: 33m
  • Blu: 34m
  • Viola: 35m
  • Ciano: 36m
  • Bianco: 37m
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top