Ändern Sie die Hintergrundfarbe des tmux-Bereichs abhängig vom Remote-Hostnamen

Ändern Sie die Hintergrundfarbe des tmux-Bereichs abhängig vom Remote-Hostnamen

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_XYZund 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 $helperdie Funktion darauf verweist ( $HOME/bin/_ssh_tmux_backgroundin meinem Code), und machen Sie es ausführbar.

Wenn Sie jetzt aufrufen ssh, führt die Funktion den eigentlichen sshBefehl mit zwei zusätzlichen Optionen aus: PermitLocalCommandund LocalCommand( man 5 ssh_configDetails 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_PANEUmgebungsvariable. 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 bashdann den Shebang ändern). Am Ende wird der Stil angewendet.

Nach sshdem 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 defaultan übergeben tmux.


PermitLocalCommandBeachten Sie, dass Sie und LocalCommandin /etc/ssh/ssh_configoder in angeben können ~/.ssh/config. Sie können den Wrapper jedoch nicht so einfach entfernen, da Sie die Hintergrundfarbe nach sshdem 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 sshdie PID seines übergeordneten Elements ( 's) abruft, in den Hintergrund wechselt (und so sshfortfährt), die PID überwacht und tmuxdie Einstellungen nach sshdem Beenden wiederherstellt. Ein solches Skript könntespeichernden ursprünglichen Stil des Bereichs, egal wie dieser aussah, und ihn später wiederherstellen, anstatt den defaultStil 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_configsagt:

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/binund dann wird es noch besser:

LocalCommand=_ssh_tmux_style 'bg=red'

Ich finde es ziemlich elegant.

verwandte Informationen