Vor Kurzem bin ich auf das Kitty-Terminal gewechselt. Einfach mal schauen, wie das so ist. Man hört ja nur Gutes. Soll zügig sein und so weiter.
Ach, was soll ich sagen: Ich habe mich quasi bequatschen lassen.
Kitty, SSH und TERM=xterm-kitty
Mittlerweile nutze ich Kitty seit ungefähr einer Woche und hatte mich seitdem tatsächlich kein einziges Mal per SSH mit einem meiner Server verbunden.
Ich weiß auch nicht, wie das passiert ist.
Vermutlich war ich einfach zu stark mit anderen Dingen beschäftigt. Vor allem direkt auf dem Mac und weniger am Homelab. Dort läuft gerade schließlich alles „stabil“.
Als ich mich heute dann mit srv-keller verbunden habe, bekam ich kurz eine halbe Panikattacke.
Doppelte Zeichen, Pfeiltasten, die irgendwelche Zeichencodes ausgeben, und eine Shell, die praktisch nicht nutzbar war.
Also recherchiert, Ursache gefunden, verstanden und behoben.
Die Ursache
Kitty verwendet standardmäßig folgende Terminalkennung:
TERM=xterm-kitty
Diese Information wird bei einer SSH-Verbindung an den entfernten Server übergeben.
Fehlt dort die passende Terminalbeschreibung für xterm-kitty, kann der Server die von Kitty gesendeten Steuerzeichen nicht korrekt verarbeiten.
Das Ergebnis sind dann unter anderem:
- doppelte Zeichen
- Zeichencodes beim Drücken der Pfeiltasten
- ein nicht korrekt funktionierendes Backspace
- allgemein fehlerhafte Eingaben
Das normale macOS-Terminal verwendet meistens:
TERM=xterm-256color
Diese Terminalbeschreibung ist auf den meisten Linux-Systemen bereits vorhanden. Deshalb tritt das Problem dort normalerweise nicht auf.
Kitty bringt für diesen Fall einen eigenen SSH-Aufruf mit:
kitty +kitten ssh
Dieser sorgt unter anderem dafür, dass die benötigte Terminalbeschreibung auf dem entfernten Server verfügbar ist.
Natürlich möchte ich nicht bei jeder SSH-Verbindung daran denken, statt ssh jedes Mal kitty +kitten ssh zu schreiben.
Deshalb wird der normale ssh-Befehl innerhalb von Kitty durch einen Alias ersetzt.
Verwendete Shell herausfinden
Der Eintrag gehört nicht pauschal in die ~/.zshrc.
Er gehört in die Konfigurationsdatei der Shell, die im Terminal tatsächlich verwendet wird.
Welche Shell aktuell läuft, zeigt folgender Befehl:
ps -p $$ -o comm=
Die Ausgabe lautet beispielsweise:
zsh
oder:
bash
Alternativ kann die konfigurierte Login-Shell ausgegeben werden:
echo "$SHELL"
Beispielsweise:
/bin/zsh
Konfiguration für Zsh
Wird Zsh verwendet, gehört der Eintrag in folgende Datei:
~/.zshrc
Dort wird folgender Block ergänzt:
if [[ -n "$KITTY_WINDOW_ID" ]]; then
alias ssh="kitty +kitten ssh"
fi
Anschließend wird die Konfiguration neu geladen:
source ~/.zshrc
Konfiguration für Bash
Wird Bash verwendet, gehört der Eintrag in folgende Datei:
~/.bashrc
Auch dort wird derselbe Block ergänzt:
if [[ -n "$KITTY_WINDOW_ID" ]]; then
alias ssh="kitty +kitten ssh"
fi
Anschließend wird die Konfiguration neu geladen:
source ~/.bashrc
Unter macOS kann es vorkommen, dass Bash beim Start einer Login-Shell nur die Datei ~/.bash_profile lädt.
In diesem Fall sollte die ~/.bashrc innerhalb der ~/.bash_profile eingebunden werden:
if [[ -f ~/.bashrc ]]; then
source ~/.bashrc
fi
Was der Alias macht
Die Umgebungsvariable KITTY_WINDOW_ID ist nur innerhalb eines Kitty-Fensters gesetzt.
Durch diese Abfrage:
if [[ -n "$KITTY_WINDOW_ID" ]]; then
wird der Alias ausschließlich innerhalb von Kitty angelegt.
Der normale Aufruf:
ssh benutzer@server
verwendet innerhalb von Kitty dadurch automatisch:
kitty +kitten ssh benutzer@server
In anderen Terminalprogrammen bleibt der normale ssh-Befehl unverändert.
Damit waren auch auf srv-keller die doppelten Zeichen und die ausgegebenen Zeichencodes der Pfeiltasten verschwunden.