Zum Inhalt springen

lftp-Eigenart bei der SSH-Public-Key-Authentifizierung

Lesezeit
Eine isometrische, technisch geprägte Illustration in Blau- und Neongrüntönen, die eine GitLab-CI/CD-Deployment-Pipeline auf einem Rasterhintergrund zeigt.
Dieses KI-generierte Bild soll diesen Blogbeitrag zusammenfassen. Irgendwie.

Kürzlich habe ich meine Deployment-Pipeline in GitLab für diesen Blog eingerichtet. Dafür verwende ich die mirror-Funktion von lftp, um den Public-Ordner auf meinen Server zu spiegeln.

Das Mirroring erfolgt natürlich über eine gechrootete SFTP-Verbindung, gesichert durch passwortlose Public-Key-Authentifizierung. Normalerweise kein Problem für lftp, aber in meiner Pipeline wollte es einfach nicht funktionieren.

Damit ihr versteht, was ich meine, hier meine Pipeline (vereinfacht):

before_script: # Abhängigkeiten installieren usw. # SSH-Private-Key aus Umgebungsvariablen einfügen script: # Hugo-Seiten bauen - echo "Starte SFTP-Deployment..." - lftp -e "set sftp:auto-confirm yes; open -p $SSH_PORT sftp://$SSH_USER@$SSH_IP; lcd ./public; mirror -R -e ." - echo "Deployment abgeschlossen."

Aus irgendeinem Grund erschien beim lftp-Befehl immer die Meldung open: GetPass() failed -- assume anonymous login, und dann hing es fest. Wahrscheinlich versuchte lftp, sich anonym bei meinem SFTP-Server anzumelden, was natürlich nicht funktioniert. Trotzdem versuchte ich es zu beheben, ohne Erfolg. Claude versuchte es, ebenfalls ohne Erfolg. Vielleicht war der SSH-Key nicht korrekt eingerichtet. Nein. Vielleicht fand lftp meinen Key nicht. Nein. Claude versuchte, den Befehl sftp:connect-program 'ssh -a -x -i /path/to/ssh/key -o BatchMode=yes vor dem open-Befehl zu setzen. Auch nichts.

Nach vielen Versuchen führte ich die lftp-Befehle auf meinem lokalen Rechner manuell aus und nicht in einem Skript. Und tatsächlich: Es fragte nach einem Passwort.
Ein Passwort? Es gibt kein Passwort. Weder für den Key noch für den Login.
Also drückte ich Enter – und war über SFTP eingeloggt. Ich versuchte es nochmal, gab eine beliebige Zeichenkette ein, und war ebenfalls eingeloggt.

Später fand ich einen Thread auf Stack Overflow (den genauen Link habe ich leider nicht mehr). Wie sich herausstellte, muss man ein Passwort eingeben, obwohl keines existiert. Einfach irgendeine beliebige Zeichenkette als Passwort eingeben.

Somit sieht die finale, funktionierende Pipeline folgendermaßen aus (wieder vereinfacht):

before_script: # Abhängigkeiten installieren usw. # SSH-Private-Key aus Umgebungsvariablen einfügen script: # Hugo-Seiten bauen - echo "Starte SFTP-Deployment..." - lftp -e "set sftp:auto-confirm yes; open -u $SSH_USER:some_random_bla -p $SSH_PORT sftp://$SSH_IP; lcd ./public; mirror -R -e ." - echo "Deployment abgeschlossen."

Ich habe -u $SSH_USER:some_random_bla zum open-Befehl hinzugefügt, damit lftp ein zufälliges Passwort verwendet und nicht versucht, danach zu fragen.

Und jetzt funktioniert es, und Claude hat etwas in eine Memory-Datei geschrieben.


Oli out