Wenn ich mich in einem einzelnen Fenster per SSH von tmux aus mit einem Remote-Server verbinde, ist es dann möglich, die Hintergrundfarbe des Fensters basierend auf dem Servernamen zu ändern?
Angenommen, alle meine Produktionsserver beginnen mit prod_XYZ
und ein Entwicklungsserver beginnt mit. dev_XYZ.
Wenn ich mich per SSH mit diesen beiden Servern verbinde, kann ich sie dann je nach Servertyp, auf dem ich mich befinde, unterschiedlich einfärben? Das heißt, je nach Serverpräfix?
Antwort1
Wenn ich mich per SSH mit diesen beiden Servern verbinde, kann ich sie dann je nach Servertyp, auf dem ich mich befinde, unterschiedlich einfärben?
Ja.
Meine grundlegende Lösung erfordert einen Wrapper ssh
(dies kann eine Shell-Funktion oder ein Skript sein) sowie ein zusätzliches Hilfsskript.
Die Wrapper-Funktion sollte wie folgt aussehen:
ssh() {
helper="$HOME/bin/_ssh_tmux_background"
command ssh \
-o PermitLocalCommand=yes \
-o LocalCommand="'$helper' '%h'" \
"$@"
"$helper"
}
Und dies ist das Hilfsskript:
#/bin/sh
[ -z "$TMUX_PANE" ] && exit
style=default
case "$1" in
prod_* )
style='bg=red'
;;
dev_* )
style='bg=blue'
;;
esac
tmux select-pane -P "$style" -t "$TMUX_PANE"
Speichern Sie das Skript dort, wo $helper
die Funktion darauf verweist ( $HOME/bin/_ssh_tmux_background
in meinem Code), und machen Sie es ausführbar.
Wenn Sie jetzt aufrufen ssh
, führt die Funktion den eigentlichen ssh
Befehl mit zwei zusätzlichen Optionen aus: PermitLocalCommand
und LocalCommand
( man 5 ssh_config
Details finden Sie unter). Auf diese Weise führen Sie das Hilfsskript mit dem Remote-Hostnamen als einzigem Argument aus, sobald Sie sich beim Remote-Host anmelden.
Wenn Sie sich in befinden tmux
, erbt das Skript die TMUX_PANE
Umgebungsvariable. Das Skript wird sofort beendet, wenn es sich außerhalb von befindet tmux
. Es sollte also keine Störungen verursachen, selbst wenn Sie die Funktion ohne verwenden tmux
.
Das Skript gleicht den Remote-Hostnamen mit Ihren Präfixen ab und wählt den gewünschten Stil für aus tmux
. Sie sind nicht auf beschränkt case
, Sie können Ihre Logik beliebig erstellen (einschließlich Regex-Abgleich mit [[
, aber Sie müssen bash
dann den Shebang ändern). Am Ende wird der Stil angewendet.
Nach ssh
dem Beenden ruft die Funktion das Skript ohne Argumente auf. "$1"
Die Auswertung ergibt einen leeren String, der keinem unserer Muster entspricht. Daher wird der Standardstil von default
an übergeben tmux
.
PermitLocalCommand
Beachten Sie, dass Sie und LocalCommand
in /etc/ssh/ssh_config
oder in angeben können ~/.ssh/config
. Sie können den Wrapper jedoch nicht so einfach entfernen, da Sie die Hintergrundfarbe nach ssh
dem Beenden erneut ändern müssen.
Dennoch kann eine Lösung ohne Wrapper erwünscht sein. Stellen Sie sich ein Skript vor (aufgerufen mit LocalCommand
), das ssh
die PID seines übergeordneten Elements ( 's) abruft, in den Hintergrund wechselt (und so ssh
fortfährt), die PID überwacht und tmux
die Einstellungen nach ssh
dem Beenden wiederherstellt. Ein solches Skript könntespeichernden ursprünglichen Stil des Bereichs, egal wie dieser aussah, und ihn später wiederherstellen, anstatt den default
Stil zu verwenden.
Lasst es uns tun. Das ist mein Versuch:
#/bin/sh
[ -z "$TMUX_PANE" ] && exit
[ "$#" -eq 1 ] || exit 1
newstyle="$1"
oldstyle="$(tmux select-pane -g -t "$TMUX_PANE")"
tmux select-pane -P "$newstyle" -t "$TMUX_PANE"
( tail --pid="$PPID" -f /dev/null
tmux select-pane -P "$oldstyle" -t "$TMUX_PANE" ) &
Das neue Skript (sagen wir $HOME/bin/_ssh_tmux_style
) sollte ebenfalls ausführbar sein. Es verwendet tail --pid
, was nicht portierbar ist; siehediese Fragefür alternative Ansätze.
Jetzt brauchen wir die alte Wrapper-Funktion nicht mehr (also starten wir eine neue Shell oder unset -f ssh
). Alles was wir brauchen ist ~/.ssh/config
. Remember man 5 ssh_config
sagt:
Da der erste erhaltene Wert für jeden Parameter verwendet wird, sollten eher hostspezifische Deklarationen am Anfang der Datei und allgemeine Standardwerte am Ende angegeben werden.
Unter Berücksichtigung dieses Aspekts platzieren Sie Folgendes an der richtigen Stelle in Ihrem ~/.ssh/config
:
Host prod_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=red'
Host dev_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=blue'
Die Anführungszeichen sind wichtig. Beachten Sie, dass die gesamte zusätzliche Konfiguration (Stile) jetzt in die Konfiguration von eingebettet ist ssh
. Machen Sie Ihr eigenes $PATH
„contain“ $HOME/bin
und dann wird es noch besser:
LocalCommand=_ssh_tmux_style 'bg=red'
Ich finde es ziemlich elegant.