SFTP: "subsystem request failed on channel 0" und "Connection closed"

Der Server hat Ihre Anmeldung akzeptiert, aber keinen SFTP-Dienst konfiguriert. Es ist also eine Server-Einstellung und kein Problem mit Passwort oder Schlüssel. Tragen Sie Subsystem sftp internal-sftp in /etc/ssh/sshd_config ein, prüfen Sie mit sudo sshd -t und laden Sie den SSH-Dienst neu. Haben Sie nur scp und können den Server nicht ändern, nutzt scp -O das alte Protokoll, das das Subsystem nicht braucht.

Lieber den Server durchblättern als sftp-Befehle tippen? Nach dieser einzeiligen Korrektur zeigt Wardterm seine Dateien neben dem Terminal. Zeigen

Aktualisiert am . Reproduziert mit OpenSSH 10.3 unter macOS (sftp und scp) gegen einen Wegwerf-OpenSSH-10.0-Server unter Debian 13, für jeden Fall unten.

Was Sie sehen

$ sftp user@server
subsystem request failed on channel 0
Connection closed

scp nutzt seit OpenSSH 9.0 denselben Dienst und scheitert daher ebenfalls:

subsystem request failed on channel 0
scp: Connection closed

Ein einfaches ssh user@server funktioniert weiterhin, denn nur der SFTP-Teil fehlt.

Den Server prüfen

sudo sshd -T | grep -i '^subsystem'

Keine Ausgabe bedeutet, dass kein Subsystem definiert ist, was der OpenSSH-Standard ist, wenn die Zeile fehlt. Das passiert oft, nachdem jemand die sshd_config durch eine kurze gehärtete Fassung ersetzt hat oder die Zeile auskommentiert wurde. sshd -t warnt Sie davor nicht.

Die Lösung

Tragen Sie eine dieser Zeilen in /etc/ssh/sshd_config ein, außerhalb jedes Match-Blocks. Die erste führt SFTP innerhalb von sshd aus und braucht kein eigenes Programm:

Subsystem sftp internal-sftp

Oder die klassische Form, mit dem Pfad für Ihr System:

Subsystem sftp /usr/lib/openssh/sftp-server

Übliche Pfade:

SystemPfad zu sftp-server
Debian, Ubuntu/usr/lib/openssh/sftp-server
RHEL, Fedora, Rocky, Alma/usr/libexec/openssh/sftp-server
Alpine/usr/lib/ssh/sftp-server, aus dem Paket openssh-sftp-server

Prüfen Sie dann und laden Sie neu. Der Dienst heißt unter Debian und Ubuntu ssh und auf Systemen im Red-Hat-Stil sshd:

sudo sshd -t && sudo systemctl reload ssh

Lassen Sie Ihre aktuelle Sitzung offen, bis eine neue Anmeldung funktioniert.

Steht die Zeile wieder, funktioniert sftp wie gewohnt. Für den Alltag siehe sftp-Befehle mit Beispielen.

Auf einem NAS oder Router

Diese Geräte schalten SFTP in ihren eigenen Einstellungen ein, nicht in sshd_config. Auf einem Synology-NAS aktivieren Sie den SFTP-Dienst unter Systemsteuerung, Dateidienste, FTP. Unter OpenWrt braucht SFTP das Paket openssh-sftp-server.

Eine Umgehung, wenn Sie den Server nicht ändern können

Für Dateikopien weisen Sie scp an, das alte Protokoll zu verwenden, das kein Subsystem braucht:

scp -O file.txt user@server:/tmp/

Sie können auch über einfaches SSH eine Pipe nutzen, da die Anmeldung selbst funktioniert:

tar -cf - folder | ssh user@server 'tar -xf - -C /tmp'

Ähnliche Meldungen, andere Ursachen

Der Pfad ist falsch

Existiert die Zeile, aber das Programm nicht, gelingt die Subsystem-Anfrage, und das Programm startet dann nicht. Sie bekommen nicht die Subsystem-Meldung, sondern nur diese:

Connection closed.
Connection closed

sshd -t prüft den Pfad nicht, testen Sie die Datei also auf dem Server:

sudo sshd -T | grep -i '^subsystem'
ls -l /usr/lib/openssh/sftp-server

Korrigieren Sie den Pfad, installieren Sie das fehlende Paket oder wechseln Sie zu internal-sftp.

Die Shell gibt etwas aus

Received message too long 1466264675
Ensure the remote shell produces no output for non-interactive sessions.

SFTP liest die ersten Bytes der Ausgabe als binäre Länge, deshalb bringt jeder Text der Shell es durcheinander. In dieser Meldung sind die großen Zahlen die Buchstaben des gelesenen Textes, als Zahl gedeutet. Prüfen Sie auf Ausgabe:

ssh user@server /bin/true | wc -c

Alles außer 0 bedeutet, dass eine Startdatei wie ~/.bashrc etwas ausgibt. Setzen Sie dies an den Anfang dieser Datei, damit der Rest nur in interaktiven Shells läuft:

case $- in
  *i*) ;;
  *) return ;;
esac

Das Konto hat eine nologin-Shell oder einen erzwungenen Befehl

Derselbe Fehler Received message too long erscheint hier, weil nologin oder ein ForceCommand Text ausgibt. Bei einem nologin-Benutzer funktionierte internal-sftp in unserem Test, da es die Shell des Benutzers nicht startet. Ändern Sie bei einem ForceCommand die Einstellung so, dass sie nicht für SFTP-Benutzer gilt, oder setzen Sie sie für diese auf internal-sftp.

Fragen

Was bedeutet subsystem request failed on channel 0?

Die Anmeldung hat geklappt, aber auf dem Server ist kein SFTP-Dienst eingerichtet. Ergänzen Sie Subsystem sftp internal-sftp in sshd_config und laden Sie SSH neu.

Warum funktioniert ssh, aber sftp nicht?

ssh braucht nur eine Shell, sftp bittet den Server zusätzlich, sein SFTP-Subsystem zu starten. Fehlt die Subsystem-Zeile oder zeigt sie auf einen falschen Pfad, scheitern nur die Dateiübertragungen.

Braucht scp das SFTP-Subsystem?

Seit OpenSSH 9.0 ja, es scheitert also genauso. scp -O nutzt das alte Protokoll, das ohne auskommt.

Quellen

Mehr zu Fehlermeldungen

Alle Anleitungen