tmux und ssh

Meine Herausforderung ist, dass ich oftmals auf einem Server verbunden bin per ssh und Aufgaben zu erledigen habe. Auf diesen Servern gibts aber kein tmux.

Dann lasse ich gerne einmal das Log mitlaufen, um Fehler zu debuggen. Dazu muss aber ein Service neu gestartet werden. Damit das Log aber nicht unterbrochen wird, verbinde ich mich in einem zweiten Fenster auch mit dem Server und starte dort das Service neu...

Das muss schöner gehen

Wozu hat man nun tmux. Das ist schön konfigurierbar und bedienerfreundlich, und kann mein Terminal in mehrere Bereiche aufteilen.

Mit einem beherzten C-b " wird nun das Fenster geteilt. Ich muss dann nur noch erneut den ssh-Befehl ausführen und schon bin ich im zweiten Teil ebenfalls auf dem Server und kann tun, was ich für richtig halte.

Das muss NOCH schöner gehen

Das geht es auch. Mittels Keybinding kann ich die immer selbe Aufteilung eines Pane in tmux erzeugen. Dazu gehört in die Datei ~/.tmux.conf folgene Zeile bind D source-file ~/.tmux/sessions/dev.session Damit wird auf das große “D” gemapped, dass das File ~/.tmux/sessions/dev.session gesourced wird.

In das File ~/.tmux/sessions/dev.session kommt dann folgender Inhalt

selectp -t 1 # select the first (0) pane
splitw -h -p 50 # split it into two halves
selectp -t 2 # select the new, second (1) pane
splitw -v -p 50 # split it into two halves
selectp -t 1 # go back to the first pane
set-environment -u sshcon 

Dabei wird das Fenster zuerst in zwei vertikale Hälften und die rechte der vertikalen Hälfte noch in zwei horizontale Hälften geteilt. WICHTIG ist die letzte Zeile. Hier wird die Environment-Variable der tmux-Umgebung sshcon gelöscht. Als lokale Variable bleibt sie aber in der Shell vorhanden.

Aber wie kommt diese Variable ins Environment von tmux?

Ganz einfach. Mit einer Funktion die ich sssh nenne, damit sie einfach zu tippen ist, wenn man sich per ssh verbinden möchte. Diese funktion sssh muss in die Datei ~/.bashrc und wird mit jeder neuen Bash geladen.

sssh() {
     [ "${sshcon:-x}" == "x" ] || set -- "${sshcon}" 
     if [ -n "${TMUX}" ]; then
         tmux set-environment sshcon "$@"
     fi
     ssh "$@"
}

Die Funktion prüft, ob sie in einer tmux-Umgebung aufgerufen wird ($TMUX ist dann nicht leer), um die tmux umgebungsvariable sshcon mit den Aufrufparametern von sssh zu setzen. Zuerst aber prüft sie, ob sshcon überhaupt gesetzt ist. Und wenn ja, dann überschreibt sie die Aufrufparameter mit dem Inhalt von $sshcon.

Das kann man bei Belieben noch umdrehen. Nur wenn sssh keine Aufrufparamter hat, wird geprüft ob sshcon gesetzt ist, und dann verwendet. Ansonsten werden die originalen Aufrufparamter verwendet. Aber das kann man an die eigenen Bedürfnisse anpassen.