Wie kann ich das Apfel Terminalfenster auto Farbschema ändern, wenn ich zu einem bestimmten Server ssh

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

  •  03-07-2019
  •  | 
  •  

Frage

Wenn ich in einen Remote-Produktions-Server ssh würde ich das Farbschema meines Terminalfensters gerne etwas ändern brigh und beängstigend, vorzugsweise rot, um mich zu warnen, dass ich eine Live beängstigend Server berühre.

Wie kann ich es automatisch erkennen, dass ich irgendwo ssh'ed, und wenn das irgendwo auf einer bestimmten Liste ist, das Farbschema ändern?

Ich mag das Schema von Terminal.app aktualisieren, nicht wissen, wie ich dies in einer reinen Linux tun würde / Unix-env

War es hilfreich?

Lösung

Setzen Sie folgende Skript in ~/bin/ssh (sicherzustellen ~/bin/ sah vor /usr/bin/ in Ihrer 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 "$@"

Das Skript oben extrahiert Hostnamen aus der Leitung "username @ host" (es wird davon ausgegangen Sie sich einloggen, um Remote-Hosts mit "ssh user @ host").

je Dann auf Hostnamen entweder setzt roten Hintergrund (für Produktionsserver) oder grünen Hintergrund (für alle andere). Als Ergebnis werden alle Ihre ssh Fenster mit farbigem Hintergrund sein wird.

Ich gehe davon aus hier Ihre Standard-Hintergrund schwarz ist, so Skript kehrt die Hintergrundfarbe schwarz zurück, wenn Sie vom Remote-Server abzumelden (siehe „Trap on_exit“).

Bitte beachten Sie, aber dieses Skript Kette von ssh-Logins nicht von einem Host zum anderen verfolgen. Als Ergebnis wird der Hintergrund für den Fall, grün sein, Sie zu Testserver zuerst anmelden, anmelden, dann zur Produktion von ihm.

Andere Tipps

Eine weniger bekannte Funktion des Terminals ist, dass Sie den Namen eines Einstellungsprofils auf einen Befehlsnamen festlegen können, und es wird dieses Profil wählen, wenn Sie ein neues Terminal entweder über Shell> Neuer Befehl ... oder Shell> New Remote-Verbindung ... .

Zum Beispiel Ihr Standardprofil duplizieren, nennen Sie es „ssh“ und legen Sie die Hintergrundfarbe auf rot. Verwenden Sie dann Neuer Befehl ... laufen ssh host.example.com.

Sie paßt auch auf Argumente, so können Sie es unterschiedliche Einstellungen für verschiedene Remote-Hosts, zum Beispiel wählen.

Hier ist eine kombinierte Lösung auf ein paar bestehenden Antworten aus, dass die Ausfahrt abwickelt. Hierzu gehört auch ein wenig mehr, wenn Sie nicht mit 16-Bit-Farbwerte beschäftigen möchten.

Dies soll gesetzt werden, um Ihre ~ / .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 - dauert 4 (8 Bit) Farbwerte
  • set_bg_from_hex - dauert 4 Hex-Werte. die meisten meiner Farbreferenzen ich verwende, sind in hex, so das macht es noch einfacher für mich. Es könnte noch einen Schritt weiter unternommen werden, um tatsächlich #RRGGBB statt RR GG BB zu analysieren, aber es funktioniert gut für mich.
  • ssh - Einwickeln der Standard ssh-Befehl mit dem, was benutzerdefinierte Logik, die Sie wollen. Die if-Anweisung wird verwendet, um den Ausgang zu handhaben die Hintergrundfarbe zu setzen.

Die Kombination von Antworten 1 und 2 haben die folgenden:

Erstellen ~/bin/ssh Datei wie in 1 mit folgendem Inhalt beschrieben:

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

Machen Sie es ausführbar. chmod +x ~/bin/ssh

Datei ~/Dropbox/macCommands/StyleTerm.scpt hat folgenden Inhalt:

#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

Wörter Basic, Homebrew, Ocean, Novel, Grass von Mac OS Terminaleinstellungen sind cmd , : Terminal Profile

Sie können das $ PS1 Variable in Ihrer .bashrc gesetzt.

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

EDIT:   Öffnen Sie dazu den Terminal. Dann sagt

#touch .bashrc

Sie können dann öffnen Bashrc in textEdit oder in TextWrangler und fügen die bisherigen Befehle.

Eine andere Lösung ist es, die Farben Straße in der SSH-Konfigurationsdatei zu setzen:

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

Xterm-kompatible Unix-Terminals verfügt über Standard-Escape-Sequenzen für die Hintergrund- und Vordergrundfarben einstellen. Ich bin mir nicht sicher, ob Terminal.app Aktien sie; es sollte.

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

Die zweite Zahl gibt die gewünschte Farbe. 0 = Standard, 1 = rot, 2 = grün, usw. Also das Snippet, wenn sie in einem gemeinsamen .bashrc setzen, werden Sie auf die Prüfung diejenigen einen roten Hintergrund auf Live-Server und einen grünen Hintergrund geben. Sie sollten auch so etwas wie diese fügen Sie den Hintergrund zurückzusetzen, wenn Sie sich abmelden.

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

EDIT: Google drehte einen Weg bis der Hintergrundfarbe unter Verwendung von Apple gesetzt. Offensichtlich funktioniert dies nur, wenn sie auf der gleichen Maschine wie Terminal.app laufen. Sie können mit ein paar Wrapper-Funktionen um das funktionieren:

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

Sie müssen sie daran zu erinnern SSHL statt ssh ausgeführt werden, wenn zu einem Live-Server zu verbinden. Eine weitere Möglichkeit ist es, eine Wrapper-Funktion für ssh zu schreiben, die seine Argumente für bekannte Live-Host-Namen durchsucht und stellt den Hintergrund entsprechend.

Warum ändert sich nicht nur die Shell-Eingabeaufforderung, wenn Sie sich per SSH angemeldet sind? Es gibt in der Regel bestimmte Shell-Variablen: SSH_CLIENT , SSH_CONNECTION , SSH_TTY

Stellen Sie die Terminal Farben in der /.bashrc des Servers

brauchte ich das Gleiche, was mir bewusst zu machen, dass ich auf einem Staging oder Produktionsserver war und nicht in meiner Entwicklungsumgebung, die sehr schwer zu sagen, vor allem, wenn in einer Ruby-Konsole oder etwas.

Um dies zu erreichen, verwenden ich den setterm Befehl in meinem Server des ~./bashrc Datei, die die Farben des Terminals inverse beim Anschließen und die Farben wiederherstellen, wenn zu verlassen.

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

Ich habe dies dann in allen ~/.bashrc Dateien Server, so dass ich weiß, wenn mein Terminal auf einem Remote-Server ist oder nicht.

Ein weiterer Vorteil ist, dass alle Ihre Entwicklung oder DevOps Team den Vorteil dieser erhalten, ohne es Teil des Onboarding-Prozess.

Funktioniert prima.

Sie sollten die Farbe von Benutzername und Host-Computernamen ändern.

fügen Sie die folgende Zeile in der ~/.bash_profile-Datei:

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

Die ersten Teil (lila gefärbt) ist das, was Sie suchen.

Vorschau: eingeben Bild Beschreibung hier

Dies ist meine bevorzugten Farben. Sie können jeden Teil der Eingabeaufforderung der Farbe anpassen, indem m Codes zu ändern (zum Beispiel 34m), die ANSI sind Farbcodes.

Liste der ANSI-Farbcodes:

  • Black: 30m
  • Rot: 31m
  • Grün: 32m
  • Gelb: 33m
  • Blue: 34m
  • Purple: 35m
  • Cyan: 36m
  • White: 37m
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top