macOS, zsh und die SSH Keys

Mal abgesehen von der Tatsache, dass Apple bis heute keine -sk Keys unterstützt, gibt es eine weitere Sache, die mich im Umgang mit SSH Keys stört. Seit dem Wechsel von bash auf zsh, werden die Keys nicht mehr automatisch geladen bzw. zum Agent hinzugefügt.

Ärgernis

Das ist ein sehr großes Ärgernis für Leute wie mich, die viel mit SSH als auch mit git arbeiten. macOS hat keinen cron, den man hierfür missbrauchen könnte, sondern nur sogenannte LaunchAgents. Einen entsprechenden hatte ich mir gebaut, der zum Systemstart ein ssh-add --apple-load-keychain ausführt. Einen LaunchAgent habe ich gewählt, damit ich das Terminal direkt ready habe, da er im Anmeldevorgang bereits läuft.

LaunchAgent

Wie nach jeder großen Major-Version von Apple benötigte dieser LauchAgent ständige Anpassung, bis er dann mit Version 13 »Ventura« endgültig versagte. Meinen Ärger über solche Kleinigkeiten, die nicht funktionieren, kann ich kaum in Worte fassen. Benutzen deren Dev’s etwa kein SSH, eat your own dogfood scheint dort nicht der Fall zu sein.

Gescriptet

Jedenfalls musste eine Lösung her, die die SSH Keys lädt als auch das Autocomplete meiner .ssh/config ermöglicht und die Hosts auto-vervollständigt. Im ersten Schritt kopieren wir die SSH Keys in das richtige Verzeichnis:

cp /path/to/keys ~/.ssh

Danach fügen wir die Passphrase zur macOS Keychain hinzu:

ssh-add --apple-use-keychain .ssh/mykey

Wir frisieren die SSH config mit einem Texteditor unserer Wahl (nicht nano, den hat Apple auch ausgebaut…)

Host *
	UseKeychain yes
	IgnoreUnknown UseKeyChain
	AddKeysToAgent yes

Die Keys wurden zum Agenten als auch der Keychain hinzugefügt und sind einsatzbereit. Allerdings nur bis zum nächsten Neustart (oder Beenden der Session des aktuellen Benutzers). Genau das ist mein Aufreger der Woche.

Nachdem auch die LaunchAgents nicht mehr funktionieren, geht das halt nun per Shell:

vim /home/USERNAME/.zshrc
# Autocomplete Befehle und SSH Hosts
autoload -Uz compinit && compinit -i

# Lade die Keys
if [ -z "$SSH_AUTH_SOCK" ] && [ -z "$SSH_AGENT_PID" ]; then
  # If no SSH Agent is running, start one and load keys from Apple keychain
  eval `ssh-agent -s` &> /dev/null
  ssh-add --apple-load-keychain &> /dev/null
else
  if [ -z "$(ssh-add -l | grep SHA256)" ]; then
    # If agent is running but has no keys, load keys from Apple keychain
    ssh-add --apple-load-keychain &> /dev/null
  fi
fi

Nach einem Neustart/Abmelden des Benutzers wird dies bei jedem Start des Terminals ausgeführt. Nur das erste Mal nach Neustart dauert dies, je nach Anzahl der Keys, etwas länger (müssen ja erst zum Agent hinzugefügt werden). Die Keys sind geladen und das OS kann sich nicht mehr dagegen wehren, so wie mit der LaunchAgent-Methode.

Linux kann’s besser

Etwas Nachtreten lasse ich mir nicht nehmen: Linux kann das out of the box. Apple stellt sich immer als anwenderfreundlich dar. Ist das wirklich anwenderfreundlich? Zugegeben, es ist ein Pro-User-Fall, aber dennoch hätte es vor ein paar Major-Versionen beim Wechsel von bash auf zsh auffallen MÜSSEN. Spätestens einem internen Entwickler nach Release. Als jemand, der gezwungen ist, mit drei Betriebssystemen zu arbeiten, finde ich solche »Schlampereien« nur bei macOS und Windows. Die »Großen« sollten sich da mal eine Scheibe von Debian und RedHat abschneiden, da würde es so etwas nicht geben.

Teilt den Beitrag, falls ihr mögt

Abonnieren
Benachrichtige mich bei
3 Kommentare
Most Voted
Newest Oldest
Inline Feedbacks
View all comments