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:
| System | Pfad 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.