Bei einem Kundenprojekt wollte ich per SFTP auf einen Webserver. Die Site war in FileZilla gespeichert: Host, Port 22, Nutzername, Passwort. Verbinden, kurz warten, „Verbindung getrennt”. Kein Hinweis auf ein falsches Passwort, kein Timeout. FileZilla hat mich nicht einmal nach dem Passwort gefragt.
Der Server war erreichbar, Port 22 offen, SSH antwortete. Also das Gleiche im Terminal, mit ausführlicher Ausgabe:
ssh -v p12345@example.orgDie letzten Zeilen sagen alles:
debug1: Offering public key: /Users/frank/.ssh/key_a ED25519
debug1: Offering public key: /Users/frank/.ssh/key_b RSA
debug1: Offering public key: /Users/frank/.ssh/key_c ED25519
Received disconnect from 185.x.x.x port 22:2: Too many authentication failuresDrei Keys angeboten, drei abgelehnt, Verbindung weg. Das Passwort kam nie dran.
Was da passiert
Ein SSH-Client probiert vor dem Passwort erst die Public-Key-Anmeldung. Läuft ein ssh-agent, bietet er dem Server jeden Key aus dem Agent an, einen nach dem anderen. Jeder Key, den der Server nicht kennt, zählt als fehlgeschlagener Versuch. Wie viele Versuche pro Verbindung erlaubt sind, legt der Server mit MaxAuthTries fest. OpenSSH liefert 6 als Standard aus, dieser Server war auf 3 gestellt.
Auf meinem Mac lagen genau drei Keys im Agent:
ssh-add -lDrei Keys, drei erlaubte Versuche, Passwort chancenlos. Zur Kontrolle einmal ohne Keys anmelden:
ssh -o PubkeyAuthentication=no p12345@example.orgJetzt fragt der Server nach dem Passwort. Der Zugang war nie kaputt, nur die Reihenfolge.
Warum FileZilla das nicht abstellt
FileZilla hat für SFTP kein eigenes Protokoll-Modul. Unter der Haube arbeitet fzsftp, ein Ableger von PuTTYs psftp. Der findet auf dem Mac den Agent über die Umgebungsvariable SSH_AUTH_SOCK und macht dasselbe wie OpenSSH: alle Keys anbieten, dann erst das Passwort aus dem Site Manager.
Der Logon-Typ „Normal” mit gespeichertem Passwort ändert daran nichts. Er regelt nur, was FileZilla schickt, wenn der Server nach einem Passwort fragt. Eine Einstellung „Agent nicht verwenden” gibt es nicht, weder pro Site noch global. Das FileZilla-Forum bestätigt das, und das Thema hat ein eigenes Ticket im Bugtracker.
Vier Auswege
Agent für FileZilla ausblenden. Der schnellste Weg. FileZilla beenden und aus dem Terminal mit leerer Variable starten:
SSH_AUTH_SOCK= /Applications/FileZilla.app/Contents/MacOS/filezilla &FileZilla sieht keinen Agent, bietet keine Keys an, und das gespeicherte Passwort greift beim ersten Versuch. Der Rest des Systems merkt nichts davon.
Agent leeren. ssh-add -D wirft alle Keys aus dem Agent. Funktioniert, kostet dich aber beim nächsten ssh auf einen anderen Server die Passphrase-Eingabe.
Unter der Grenze bleiben. Mit höchstens zwei Keys im Agent kommt das Passwort noch dran, wenn der Server drei Versuche erlaubt. Fragil, weil du die Grenze des Servers nicht kennst.
Key hinterlegen. Die saubere Lösung. Public Key auf dem Server eintragen lassen, im Site Manager Logon-Typ „Schlüsseldatei” mit genau diesem Key. Dann ist der erste Versuch der richtige.
Ein Doppelklick statt Terminal
Weil ich den ersten Weg öfter brauche, habe ich daraus eine kleine App gemacht. Ein AppleScript, das prüft, ob FileZilla läuft, es auf Wunsch beendet und dann ohne Agent neu startet:
set fzBin to "/Applications/FileZilla.app/Contents/MacOS/filezilla"
set isRunning to false
try
do shell script "pgrep -x filezilla >/dev/null"
set isRunning to true
end try
if isRunning then
set answer to display dialog "FileZilla läuft bereits (mit ssh-agent)." & return & return & "Beenden und ohne Agent neu starten?" buttons {"Abbrechen", "Neu starten"} default button "Neu starten" with icon caution
if button returned of answer is "Abbrechen" then return
tell application "FileZilla" to quit
repeat 30 times
delay 0.5
try
do shell script "pgrep -x filezilla >/dev/null"
on error
exit repeat
end try
end repeat
end if
do shell script "SSH_AUTH_SOCK= nohup " & quoted form of fzBin & " >/dev/null 2>&1 &"Das Skript als Programm kompilieren und das FileZilla-Icon übernehmen, damit es im Launchpad nicht wie ein Fremdkörper aussieht:
osacompile -o "/Applications/FileZilla ohne Agent.app" fz.applescript
cp /Applications/FileZilla.app/Contents/Resources/filezilla.icns \
"/Applications/FileZilla ohne Agent.app/Contents/Resources/applet.icns"Der Dateiname des Icons steht in der Info.plist der App unter CFBundleIconFile.
Beim ersten Start fragt macOS, ob das Programm FileZilla steuern darf. Einmal bestätigen, fertig. Wer FileZilla Pro einsetzt, ersetzt in beiden Blöcken den App-Namen.
Und wenn dir FileZilla das nächste Mal die Verbindung trennt, bevor es nach dem Passwort fragt: Schau erst in den Agent, dann in den Site Manager.
Links
- FileZilla-Forum: Not possible to disable SSH public key authentication? https://forum.filezilla-project.org/viewtopic.php?t=52987
- FileZilla-Bugtracker, Ticket #7739: Too many authentication failures https://trac.filezilla-project.org/ticket/7739
- OpenSSH sshd_config, MaxAuthTries: https://man.openbsd.org/sshd_config#MaxAuthTries

