Wie ändere ich automatisch den Terminalhintergrund basierend auf dem ssh-Hostnamen?

9

Wie kann man die Hintergrundfarbe eines Terminalfensters basierend auf dem Hostnamen, in den Sie ssh eingeben, progmatisch ändern?

Das heißt, wenn ich in eingebettete Live-Systeme auf Produktionshardware eingebunden bin, möchte ich, dass der Terminalhintergrund rot wird, um "zu wissen", auf welchem ​​Server ich mich befinde. Es reicht nicht immer aus, nur den Hostnamen in PS1 zu haben.

Ich benutze Gnome-Terminal, würde aber jede funktionsfähige Lösung unter Linux akzeptieren.

Mtl Dev
quelle

Antworten:

7

Mit dem Befehl ssh LocalCommand können Sie die ANSI-Escape-Sequenz ausgeben, um die Hintergrundfarbe zu ändern, und einen Abschnitt pro Host (oder Hostmuster) festlegen, um die entsprechende Farbe auszuwählen, die dem Remote-Host entsprechen soll.

Wenn Ihre Produktionsserver einer Namenskonvention wie "Startet mit Produkt" folgen, können Sie das folgende Snippet in Ihrer ~ / .ssh / config-Datei ausprobieren: Host prod* PermitLocalCommand yes LocalCommand printf "\x1b[41m\x1b[2JPRODUCTION SYSTEM [%n]\n\n"

Wenn es keine praktische Namenskonvention gibt, um Platzhaltermuster zu verwenden, können Sie einfach die durch Leerzeichen getrennten Hostnamen auflisten. Sie können zusätzliche Hostblöcke mit unterschiedlichen Farbwerten und Zeichenfolgen auch für verschiedene andere Nichtproduktionsserver erstellen.

Nach dem Herstellen einer Verbindung zu einem Host, der dem Muster entspricht, wird der entsprechende Druck lokal ausgeführt und die Hintergrundfarbe in Rot geändert (der [41m wählt Rot als Hintergrundfarbe, der [2J-Teil malt den gesamten Bildschirm mit der aktualisierten Hintergrundfarbe neu) https://en.wikipedia.org/wiki/ANSI_escape_code für viele weitere Optionen)

Das größte Ärgernis bei diesem Ansatz ist, dass die Hintergrundfarbe beim Verlassen der SSH-Sitzung bestehen bleibt. Es gibt kein Gegenstück zu LocalCommand, das beim Trennen ausgeführt werden kann (das ist mir bekannt). Ein Alias- oder Shell-Wrapper-Skript für ssh kann printf "\x1b[0m"als Reset aufgerufen werden. Wenn Sie jedoch die Hintergrundfarbe über LocalCommand festlegen, erhalten Sie die Farbe auch dann, wenn ssh nicht über ein Wrapper-Skript oder einen Alias ​​ausgeführt wird.

PKapp
quelle
Ausgezeichnete Antwort! Das einzige Problem, das ich sehe, das jedoch von Bedeutung ist, ist, dass die Farbänderung nur für den ersten "Bildschirm" bleibt. Sobald Befehle eingegeben werden und der Bildschirm nach oben rollt, wechselt er von rot zurück zu schwarz. Vielleicht überschreibt die Farbsteuerung am Gnomterminal die ANSI-Escape-Sequenz? Kennen Sie eine Problemumgehung?
Mtl Dev
Ist es möglich, etwas Ähnliches wie die PS1-Eingabeaufforderungsvariable auf dem SSH-Host zu tun?
Mtl Dev
Das Zurücksetzen kann durch Sequenzen in Ihrer PS1-Eingabeaufforderungsvariablen verursacht werden oder wenn Sie Befehle wie lsAlias ​​haben ls --color=autound die Reset-Sequenz '<ESC> [0m' enthält. Um dies jedoch beizubehalten, müssten Sie wahrscheinlich verschiedene Gnome-Terminal-Profile gnome-terminal --profile=$PROFILE_NAME -e ssh $HOST &
einrichten
Sie haben genau Recht: Wenn ich ls --colourODER die Rücksetzsequenz in PS1 habe, überschreibt entweder eine allein die vorherigen Ansi-Farbeinstellungen. Ich werde mich also mit der Implementierung Ihrer vorgeschlagenen Wrapper-Skriptlösung befassen, was ebenfalls eine hervorragende Idee ist! Merci Beaucoup!
Mtl Dev
Nur damit andere es wissen: Das Hinzufügen von printf zu ~ / .ssh / config scheint rsync zu unterbrechen. Verwandte Details hier: serverfault.com/questions/267154/…
Mtl Dev