Stellen Sie sich folgendes Szenario vor: Ich habe die Maschinen, mit host1
denen host4
ich mich verbinden möchte, in jeweils einem Bereich aufgelistet.
Ich habe mein Tmux-Fenster gleichmäßig in vier Bereiche aufgeteilt, sodass jeder von ihnen eine SSH-Verbindung zu diesen Hosts hosten kann.
Wenn die Verbindung bereits besteht und die Fenster synchronisiert sind, funktioniert alles einwandfrei. Ich kann Befehle ausgeben, die auf allen Hosts gleichzeitig ausgeführt werden.
Jetzt dachte ich mir jedoch, dass es ganz nett wäre, mit jedem Host eine Verbindung herstellen zu können, indem man denexakt der gleiche Befehl. Auf diese Weise konnte ich die Synchronisierung zwischen den Fenstern aktivieren, noch bevor ich eine Verbindung zu diesen Hosts herstellte.
Leider fällt mir keine Methode ein, die funktioniert. Ich habe Folgendes versucht:
ssh root@host$(tmux run "echo '#{pane_index}'")
Die Idee dahinter ist, dass dies abhängig vom Bereich, in dem der Befehl ausgeführt wird, ssh root@host1
aufgelöst werden sollte.ssh root@host4
Leider war das Ergebnis ziemlich unerwartet. Obwohl der Befehl ausgeführt wurde (während Fenster 1 aktiv war), wurden alle Verbindungen zu hergestellt host1
. Offensichtlich pane_index
bezieht sich diese Variable also auf das aktuell aktive Fenster und nicht auf das Fenster, in dem der Befehl ausgegeben wird.
Wie kann ich eine Verbindung herstellen, host1
indem host4
ich den Fensterindex (oder etwas anderes) verwende, indem ich denexakt der gleiche Befehlin jedem Bereich, anstatt einzelne Befehle eingeben zu müssen?
NB: Alle Indizes beginnen bei 1, aber dies könnte natürlich auch funktionieren, wenn dies nicht der Fall wäre, z. B. mithilfe von $((...))
in Bash.
Antwort1
Es gibt nur wenige Probleme.
Damit
$(foo)
es funktioniert,foo
sollten die gewünschten Informationen auf die Standardausgabe gedruckt werden.tmux run …
tut dies nicht; eszeigtdas Ergebnis im Kopiermodus. Sie möchtentmux display -p …
.tmux display -p '#{pane_index}'
kann Ihnen nützliche Zahlen liefern, wenn Sie den Befehl Bereich für Bereich aufrufen, aber in synchronisierten Bereichen ist die Ausgabe identisch. Dies liegt daran, dass, wenn Sie keinen Bereich angeben (mit-t
), der aktuell aktive Bereich angenommen wird. Wenn Sie Bereich für Bereich aufrufen, ist jedes Mal der richtige Bereich aktiv. Wenn Sie in synchronisierten Bereichen aufrufen, ist genau ein Bereich aktiv und sein Index wird von allen Befehlen zurückgegeben.Um den Bereich, in dem ein Befehl ausgeführt wird, zuverlässig zu identifizieren, verwenden Sie die
$TMUX_PANE
Umgebungsvariable. In Ihrem Fall können Sie dies nicht direkt tun.# flawed ssh root@host"${TMUX_PANE#%}"
Das Problem ist, dass
$TMUX_PANE
es mit übereinstimmt#{pane_id}
, nicht mit#{pane_index}
. Die Fenster-IDs sind auf dem gesamten tmux-Server eindeutig. Sie erhalten%0
,%1
,%2
,%3
für die ersten vier erstellten Fenster. Die betreffenden Fenster können Ihnen auch%7
,%8
,%13
,%14
, geben, wenn früher und in der Zwischenzeit andere Fenster erstellt wurden.Der richtige Weg besteht darin,
$TMUX_PANE
einen Bereich anzugeben und#{pane_index}
die gewünschte Nummer abzurufen.
Lösung:
ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"
Es generiert host0
…, host3
aber es sieht so aus, als wüssten Sie, was zu tun ist, um host1
… zu erhalten host4
. Ich habe beschlossen, die Lösung nicht mit zu verschleiern $((…))
.
Antwort2
Sie können die Variable verwenden $TMUX_PANE
, die tmux in der Umgebung des Befehls jedes Fensters platziert. Wenn Sie beispielsweise den Befehl
tmux send-keys 'echo host${TMUX_PANE#%}' Enter
Sie sehen in jedem Bereich host0
, oder host1
, usw. Ersetzen Sie also echo durch Ihren SSH-Befehl.