Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

tmux & screen

Terminal-Multiplexer ermöglichen mehrere Terminal-Sitzungen in einem Fenster. Sie sind unverzichtbar für Remote-Arbeit, da Sessions auch nach Verbindungsabbruch weiterlaufen.

1 tmux Grundlagen

tmux (Terminal Multiplexer) ist der moderne Standard für Terminal-Multiplexing. Es ist leistungsfähiger und aktiver entwickelt als das ältere screen.

1.1 Installation

# macOS (Homebrew)
brew install tmux

# Version prüfen
tmux -V

1.2 Konzepte

tmux organisiert sich in drei Ebenen:

Server
  └── Session (benannte Sitzung)
        └── Window (Tab/Fenster)
              └── Pane (geteilter Bereich)
BegriffBeschreibung
ServerHintergrundprozess, verwaltet alle Sessions
SessionBenannte Arbeitsumgebung mit mehreren Windows
WindowEinzelnes Terminal (wie ein Tab)
PaneGeteilter Bereich innerhalb eines Windows

1.3 Erste Schritte

# Neue Session starten
tmux

# Neue benannte Session
tmux new -s arbeit

# Session verlassen (läuft weiter)
# Prefix + d  (Ctrl+b, dann d)

# Sessions auflisten
tmux ls

# Zu Session verbinden
tmux attach -t arbeit
tmux a -t arbeit          # Kurzform

# Letzte Session
tmux attach
tmux a

1.4 Prefix-Taste

Alle tmux-Befehle beginnen mit dem Prefix (Standard: Ctrl+b), gefolgt von einer Taste.

Ctrl+b, dann Befehlstaste

Beispiel: Um ein neues Fenster zu erstellen: Ctrl+b, loslassen, dann c.

Notation in dieser Referenz:

  • Prefix + x bedeutet: Ctrl+b drücken, loslassen, dann x drücken
  • Prefix kann in der Konfiguration geändert werden (oft zu Ctrl+a)

2 Fenster, Panes, Sessions

2.1 Session-Befehle

Tastenkürzel (innerhalb tmux):

KürzelBeschreibung
Prefix + dSession detachen (verlassen)
Prefix + sSession-Liste anzeigen
Prefix + $Session umbenennen
Prefix + (Vorherige Session
Prefix + )Nächste Session

Kommandozeile:

# Neue Session
tmux new -s name

# Mit bestimmtem Startverzeichnis
tmux new -s projekt -c ~/projekte/webapp

# Session beenden
tmux kill-session -t name

# Alle Sessions beenden
tmux kill-server

# Session umbenennen
tmux rename-session -t alt neu

2.2 Window-Befehle (Fenster)

Windows sind wie Tabs innerhalb einer Session.

Tastenkürzel:

KürzelBeschreibung
Prefix + cNeues Window erstellen
Prefix + ,Window umbenennen
Prefix + &Window schließen (mit Bestätigung)
Prefix + nNächstes Window
Prefix + pVorheriges Window
Prefix + 0-9Zu Window 0–9 wechseln
Prefix + wWindow-Liste anzeigen
Prefix + lLetztes Window
Prefix + 'Window nach Nummer auswählen
Prefix + fWindow nach Name suchen

Kommandozeile:

# Neues Window in bestehender Session
tmux new-window -t session:

# Window mit Name
tmux new-window -t session: -n "logs"

# Window schließen
tmux kill-window -t session:2

2.3 Pane-Befehle (Bereiche)

Panes teilen ein Window in mehrere Bereiche.

Tastenkürzel:

KürzelBeschreibung
Prefix + %Vertikal teilen (links/rechts)
Prefix + "Horizontal teilen (oben/unten)
Prefix + xPane schließen (mit Bestätigung)
Prefix + oZum nächsten Pane wechseln
Prefix + ;Zum letzten Pane wechseln
Prefix + PfeiltastenZu Pane in Richtung wechseln
Prefix + qPane-Nummern anzeigen
Prefix + q + 0-9Zu Pane mit Nummer wechseln
Prefix + zPane zoomen (Vollbild toggle)
Prefix + !Pane in eigenes Window verschieben
Prefix + {Pane nach links/oben tauschen
Prefix + }Pane nach rechts/unten tauschen
Prefix + SpaceZwischen Layouts wechseln

Pane-Größe ändern:

KürzelBeschreibung
Prefix + Ctrl+PfeiltasteGröße in kleinen Schritten
Prefix + Alt+PfeiltasteGröße in großen Schritten

Oder im Command-Mode (Prefix + :):

resize-pane -D 10    # 10 Zeilen nach unten
resize-pane -U 5     # 5 Zeilen nach oben
resize-pane -L 10    # 10 Spalten nach links
resize-pane -R 10    # 10 Spalten nach rechts

2.4 Layouts

tmux bietet vordefinierte Layouts:

LayoutBeschreibung
even-horizontalAlle Panes nebeneinander, gleiche Breite
even-verticalAlle Panes untereinander, gleiche Höhe
main-horizontalEin großes Pane oben, Rest unten
main-verticalEin großes Pane links, Rest rechts
tiledAlle Panes gleichmäßig verteilt
# Layout wählen
Prefix + Space              # Durch Layouts rotieren
Prefix + Alt+1              # even-horizontal
Prefix + Alt+2              # even-vertical
Prefix + Alt+3              # main-horizontal
Prefix + Alt+4              # main-vertical
Prefix + Alt+5              # tiled

2.5 Copy-Mode

Der Copy-Mode ermöglicht Scrollen und Textauswahl.

KürzelBeschreibung
Prefix + [Copy-Mode starten
q oder EscapeCopy-Mode beenden
Pfeiltasten / hjklNavigation
Ctrl+u / Ctrl+dHalbe Seite hoch/runter
g / GAnfang / Ende
/Vorwärts suchen
?Rückwärts suchen
n / NNächster / Vorheriger Treffer
SpaceAuswahl starten
EnterAuswahl kopieren und beenden
Prefix + ]Einfügen

Mit vi-Modus (empfohlen):

# In ~/.tmux.conf
setw -g mode-keys vi

# Dann im Copy-Mode:
# v     = Auswahl starten
# y     = Kopieren
# V     = Zeilenweise auswählen

2.6 Command-Mode

Der Command-Mode erlaubt tmux-Befehle direkt einzugeben:

Prefix + :

Nützliche Befehle:

:new-session -s name           # Neue Session
:kill-session                  # Aktuelle Session beenden
:source ~/.tmux.conf           # Konfiguration neu laden
:list-keys                     # Alle Tastenkürzel anzeigen
:set -g option value           # Option setzen
:setw -g option value          # Window-Option setzen

3 Konfiguration

Die tmux-Konfiguration liegt in ~/.tmux.conf.

3.1 Grundlegende Einstellungen

# ~/.tmux.conf

# Prefix ändern (Ctrl+a statt Ctrl+b)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Schnelleres Escape (wichtig für vim)
set -sg escape-time 0

# History vergrößern
set -g history-limit 50000

# Nummerierung bei 1 beginnen
set -g base-index 1
setw -g pane-base-index 1

# Automatisch umnummerieren
set -g renumber-windows on

# Terminal-Farben
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"

# Maus aktivieren
set -g mouse on

# Vi-Modus für Copy-Mode
setw -g mode-keys vi

# Focus-Events (für vim etc.)
set -g focus-events on

3.2 Tastenkürzel anpassen

# Intuitivere Split-Befehle
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Neues Window im aktuellen Pfad
bind c new-window -c "#{pane_current_path}"

# Pane-Navigation mit Alt+Pfeiltasten (ohne Prefix)
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Window-Navigation mit Shift+Pfeiltasten
bind -n S-Left previous-window
bind -n S-Right next-window

# Konfiguration neu laden
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# Panes synchronisieren (gleiche Eingabe in alle Panes)
bind S setw synchronize-panes

3.3 Statusleiste anpassen

# Statusleiste aktivieren
set -g status on

# Position
set -g status-position bottom

# Update-Intervall (Sekunden)
set -g status-interval 5

# Farben
set -g status-style 'bg=#333333 fg=#ffffff'

# Links: Session-Name
set -g status-left '#[fg=#000000,bg=#ffffff] #S #[default] '
set -g status-left-length 30

# Rechts: Datum und Uhrzeit
set -g status-right '#[fg=#ffffff] %Y-%m-%d %H:%M '
set -g status-right-length 50

# Window-Liste
set -g status-justify left

# Aktives Window hervorheben
setw -g window-status-current-style 'fg=#000000 bg=#00ff00 bold'
setw -g window-status-current-format ' #I:#W#F '

# Inaktive Windows
setw -g window-status-style 'fg=#888888'
setw -g window-status-format ' #I:#W#F '

3.4 Pane-Darstellung

# Aktiver Pane-Rahmen
set -g pane-active-border-style 'fg=#00ff00'

# Inaktiver Pane-Rahmen
set -g pane-border-style 'fg=#555555'

# Pane-Nummern-Anzeige
set -g display-panes-time 2000
set -g display-panes-colour '#555555'
set -g display-panes-active-colour '#00ff00'

3.5 Vollständige Beispielkonfiguration

# ~/.tmux.conf - Empfohlene Konfiguration

# === Grundeinstellungen ===
set -g prefix C-a                    # Prefix: Ctrl+a
unbind C-b
bind C-a send-prefix

set -sg escape-time 0                # Kein Delay nach Escape
set -g history-limit 50000           # Große History
set -g base-index 1                  # Windows ab 1 nummerieren
setw -g pane-base-index 1            # Panes ab 1 nummerieren
set -g renumber-windows on           # Automatisch umnummerieren
set -g mouse on                      # Maus aktivieren
setw -g mode-keys vi                 # Vi-Modus
set -g focus-events on               # Focus-Events

# === Terminal ===
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"

# === Tastenkürzel ===
# Splits (im aktuellen Verzeichnis)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

# Pane-Navigation (Alt+Pfeiltasten)
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Pane-Größe (Prefix + Shift+Pfeiltasten)
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# Window-Navigation
bind -n S-Left previous-window
bind -n S-Right next-window

# Reload
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# Copy-Mode (vi-style)
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind -T copy-mode-vi r send-keys -X rectangle-toggle

# macOS Clipboard
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"

# === Statusleiste ===
set -g status on
set -g status-position bottom
set -g status-interval 5
set -g status-style 'bg=#1a1a1a fg=#808080'

set -g status-left '#[fg=#1a1a1a,bg=#87d700,bold] #S #[default] '
set -g status-left-length 30

set -g status-right '#[fg=#808080] %d.%m.%Y #[fg=#c0c0c0]%H:%M '
set -g status-right-length 50

setw -g window-status-format ' #I:#W '
setw -g window-status-current-format '#[fg=#1a1a1a,bg=#87d700,bold] #I:#W '

# === Panes ===
set -g pane-border-style 'fg=#404040'
set -g pane-active-border-style 'fg=#87d700'

# === Messages ===
set -g message-style 'bg=#87d700 fg=#1a1a1a bold'
set -g display-time 2000

3.6 Konfiguration neu laden

# Innerhalb tmux
Prefix + :
source ~/.tmux.conf

# Oder mit Tastenkürzel (wenn konfiguriert)
Prefix + r

# Von außerhalb
tmux source-file ~/.tmux.conf

4 screen-Vergleich

screen ist der ältere Terminal-Multiplexer (seit 1987). Es ist auf vielen Systemen vorinstalliert.

4.1 screen Grundlagen

# Neue Session
screen

# Benannte Session
screen -S arbeit

# Session verlassen (detach)
Ctrl+a, dann d

# Sessions auflisten
screen -ls

# Wieder verbinden
screen -r arbeit

# Verbinden (auch wenn attached)
screen -x arbeit

4.2 screen-Befehle

KürzelBeschreibung
Ctrl+a dDetach
Ctrl+a cNeues Window
Ctrl+a nNächstes Window
Ctrl+a pVorheriges Window
Ctrl+a "Window-Liste
Ctrl+a 0-9Zu Window wechseln
Ctrl+a AWindow umbenennen
Ctrl+a kWindow beenden
Ctrl+a SHorizontal teilen
`Ctrl+a`
Ctrl+a TabZwischen Regionen wechseln
Ctrl+a XAktuelle Region schließen
Ctrl+a [Copy-Mode
Ctrl+a ]Einfügen
Ctrl+a ?Hilfe

4.3 screen-Konfiguration

Die Konfiguration liegt in ~/.screenrc:

# ~/.screenrc

# Startmeldung deaktivieren
startup_message off

# Scrollback-Buffer
defscrollback 10000

# Visual Bell statt Audio
vbell on

# Statusleiste
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'

# Shell
shell -$SHELL

4.4 Vergleich tmux vs. screen

Merkmaltmuxscreen
Erste Version20071987
Aktive EntwicklungJaMinimal
VorinstalliertSeltenOft
PrefixCtrl+bCtrl+a
Vertikale SplitsNativeMit Patch
ScriptingSehr gutBegrenzt
KonfigurationFlexibelEinfach
StatusleisteSehr anpassbarBegrenzt
Pane-HandlingAusgezeichnetRudimentär
Copy-ModeVi/EmacsEmacs-style
Session-SharingEinfachMöglich

4.5 Wann welches Tool?

tmux verwenden wenn:

  • Modernes System mit Homebrew/apt
  • Komplexe Layouts mit vielen Panes
  • Umfangreiche Anpassungen gewünscht
  • Scripting/Automatisierung benötigt

screen verwenden wenn:

  • Auf älteren/minimalen Systemen arbeiten
  • Kein tmux installiert und keine Root-Rechte
  • Einfache Anforderungen (nur Sessions)
  • Gewohnte Umgebung

Empfehlung: Auf eigenen Systemen tmux installieren und verwenden. screen-Kenntnisse sind nützlich für Server ohne tmux.

5 Remote-Session-Management

Der Hauptvorteil von Terminal-Multiplexern: Sessions überleben Verbindungsabbrüche.

5.1 Typischer SSH-Workflow

# 1. Mit Server verbinden
ssh user@server

# 2. tmux starten oder verbinden
tmux new -s arbeit
# oder
tmux attach -t arbeit

# 3. Arbeiten...

# 4. Sauber trennen (Session läuft weiter)
Prefix + d

# 5. SSH beenden
exit

# 6. Später wieder verbinden
ssh user@server
tmux attach -t arbeit
# Alles ist noch da!

5.2 Automatische tmux-Session

In ~/.bashrc oder ~/.zshrc auf dem Server:

# Automatisch tmux starten bei SSH-Login
if [-z "$TMUX"](-z%20"$TMUX".md) && [-n "$SSH_CONNECTION"](-n%20"$SSH_CONNECTION".md); then
    tmux attach -t default || tmux new -s default
fi

Vorsicht: Kann Probleme bei SCP/SFTP verursachen. Besser:

# Nur bei interaktiver Shell
if [-z "$TMUX"](-z%20"$TMUX".md) && [-n "$SSH_CONNECTION"](-n%20"$SSH_CONNECTION".md) && [$- == *i*]($-%20==%20*i*.md); then
    tmux attach -t default 2>/dev/null || tmux new -s default
fi

5.3 SSH-Verbindung in tmux

# Lokale tmux-Session
tmux new -s remote-arbeit

# Innerhalb tmux: SSH-Verbindung
ssh user@server

# Wenn Verbindung abbricht: tmux-Session lokal intakt
# Einfach erneut SSH starten

5.4 Mehrere Server verwalten

# Session für jeden Server
tmux new -s server1 -d "ssh user@server1"
tmux new -s server2 -d "ssh user@server2"

# Zwischen Sessions wechseln
Prefix + s

# Oder: Ein Window pro Server
tmux new -s servers
tmux new-window -t servers -n "web" "ssh user@webserver"
tmux new-window -t servers -n "db" "ssh user@dbserver"
tmux new-window -t servers -n "app" "ssh user@appserver"

5.5 Session-Sharing

Mehrere Benutzer können dieselbe Session sehen (Pair Programming, Support):

tmux:

# Benutzer 1: Session erstellen
tmux new -s shared

# Benutzer 2: Gleiche Session (beide sehen dasselbe)
tmux attach -t shared

# Benutzer 2: Eigene Ansicht (unabhängige Window-Auswahl)
tmux new -t shared -s user2

screen:

# Multi-User aktivieren (in .screenrc oder zur Laufzeit)
multiuser on
acladd username

# Anderer Benutzer verbindet
screen -x user/sessionname

5.6 Persistente Layouts

Session beim Start mit vordefiniertem Layout:

Script-basiert:

#!/bin/zsh
# ~/scripts/dev-session.sh

SESSION="dev"

# Prüfen ob Session existiert
tmux has-session -t $SESSION 2>/dev/null

if [ $? != 0 ]; then
    # Neue Session mit erstem Window
    tmux new-session -d -s $SESSION -n "editor"

    # Editor-Window: vim
    tmux send-keys -t $SESSION:editor "cd ~/projekt && vim" Enter

    # Zweites Window: Server
    tmux new-window -t $SESSION -n "server"
    tmux send-keys -t $SESSION:server "cd ~/projekt && npm run dev" Enter

    # Drittes Window: Terminal (gesplittet)
    tmux new-window -t $SESSION -n "term"
    tmux split-window -h -t $SESSION:term
    tmux send-keys -t $SESSION:term.1 "cd ~/projekt" Enter
    tmux send-keys -t $SESSION:term.2 "cd ~/projekt && git status" Enter

    # Zum Editor-Window wechseln
    tmux select-window -t $SESSION:editor
fi

# Zur Session verbinden
tmux attach -t $SESSION

Mit tmuxinator (empfohlen für komplexe Setups):

# Installation
brew install tmuxinator

# Neues Projekt erstellen
tmuxinator new projekt
# ~/.config/tmuxinator/projekt.yml
name: projekt
root: ~/projekt

windows:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - git status
  - server:
      panes:
        - npm run dev
  - logs:
      panes:
        - tail -f logs/app.log
        - tail -f logs/error.log
# Session starten
tmuxinator start projekt

# Session beenden
tmuxinator stop projekt

5.7 tmux und SSH-Agent

SSH-Agent-Forwarding kann in tmux problematisch sein. Lösung:

# In ~/.tmux.conf
set -g update-environment "SSH_AUTH_SOCK SSH_AGENT_PID"

# Oder: Symlink-Methode in ~/.zshrc
if [-n "$SSH_AUTH_SOCK"](-n%20"$SSH_AUTH_SOCK".md) && ["$SSH_AUTH_SOCK" != "$HOME/.ssh/ssh_auth_sock"]("$SSH_AUTH_SOCK"%20!=%20"$HOME/.ssh/ssh_auth_sock".md); then
    ln -sf "$SSH_AUTH_SOCK" "$HOME/.ssh/ssh_auth_sock"
fi
export SSH_AUTH_SOCK="$HOME/.ssh/ssh_auth_sock"

5.8 Nützliche Aliase

# In ~/.zshrc

# tmux-Aliase
alias ta='tmux attach -t'
alias tl='tmux list-sessions'
alias tn='tmux new -s'
alias tk='tmux kill-session -t'

# Schnell zu Session oder neue erstellen
t() {
    if [-n "$1"](-n%20"$1".md); then
        tmux attach -t "$1" 2>/dev/null || tmux new -s "$1"
    else
        tmux attach 2>/dev/null || tmux new -s main
    fi
}

5.9 Cheatsheet

Session-Management:

tmux                         Neue Session
tmux new -s NAME             Benannte Session
tmux ls                      Sessions auflisten
tmux attach -t NAME          Zu Session verbinden
tmux kill-session -t NAME    Session beenden
Prefix + d                   Detach
Prefix + s                   Session-Auswahl

Windows:

Prefix + c                   Neues Window
Prefix + n / p               Nächstes / Vorheriges
Prefix + 0-9                 Zu Window wechseln
Prefix + ,                   Umbenennen
Prefix + &                   Schließen
Prefix + w                   Window-Liste

Panes:

Prefix + %                   Vertikal teilen
Prefix + "                   Horizontal teilen
Prefix + Pfeiltasten         Navigation
Prefix + z                   Zoom (Vollbild)
Prefix + x                   Schließen
Prefix + Space               Layout wechseln
Prefix + !                   Pane → Window

Copy-Mode:

Prefix + [                   Copy-Mode starten
q / Escape                   Beenden
Space / v                    Auswahl starten
Enter / y                    Kopieren
Prefix + ]                   Einfügen