SFTP : « subsystem request failed on channel 0 » et « Connection closed »

Le serveur a accepté votre connexion mais n'a aucun service SFTP configuré : c'est donc un réglage du serveur, pas un problème de mot de passe ou de clé. Ajoutez Subsystem sftp internal-sftp à /etc/ssh/sshd_config, vérifiez avec sudo sshd -t, puis rechargez le service SSH. Si vous n'avez que scp et ne pouvez pas modifier le serveur, scp -O utilise l'ancien protocole, qui n'a pas besoin du subsystem.

Mis à jour le . Reproduit avec OpenSSH 10.3 sur macOS (sftp et scp) vers un serveur OpenSSH 10.0 jetable sur Debian 13, pour chaque cas ci-dessous.

Ce que vous voyez

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

scp utilise le même service depuis OpenSSH 9.0, et échoue donc aussi :

subsystem request failed on channel 0
scp: Connection closed

Un simple ssh user@server fonctionne toujours, car seule la partie SFTP manque.

Vérifier le serveur

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

Aucune sortie signifie qu'aucun subsystem n'est défini, ce qui est le comportement par défaut d'OpenSSH quand la ligne manque. Cela arrive souvent quand quelqu'un remplace sshd_config par une version durcie courte, ou que la ligne a été commentée. sshd -t ne vous avertit pas de cela.

La solution

Ajoutez l'une de ces lignes à /etc/ssh/sshd_config, en dehors de tout bloc Match. La première exécute SFTP dans sshd et n'a besoin d'aucun programme séparé :

Subsystem sftp internal-sftp

Ou la forme classique, avec le chemin de votre système :

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

Chemins courants :

SystèmeChemin de sftp-server
Debian, Ubuntu/usr/lib/openssh/sftp-server
RHEL, Fedora, Rocky, Alma/usr/libexec/openssh/sftp-server
Alpine/usr/lib/ssh/sftp-server, fourni par le paquet openssh-sftp-server

Validez ensuite et rechargez. Le service s'appelle ssh sur Debian et Ubuntu et sshd sur les systèmes de type Red Hat :

sudo sshd -t && sudo systemctl reload ssh

Gardez votre session actuelle ouverte jusqu'à ce qu'une nouvelle connexion fonctionne.

Une fois la ligne en place, sftp fonctionne normalement. Pour l'usage courant, voir les commandes sftp avec exemples.

Sur un NAS ou un routeur

Ces appareils activent SFTP dans leurs propres réglages, pas dans sshd_config. Sur un NAS Synology, activez le service SFTP dans Panneau de configuration, Services de fichiers, FTP. Sur OpenWrt, SFTP demande le paquet openssh-sftp-server.

Un contournement quand vous ne pouvez pas modifier le serveur

Pour copier des fichiers, dites à scp d'utiliser l'ancien protocole, qui n'a pas besoin de subsystem :

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

Vous pouvez aussi passer par un tube sur SSH simple, puisque la connexion elle-même fonctionne :

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

Messages similaires, causes différentes

Le chemin est faux

Quand la ligne existe mais que le programme n'est pas là, la demande de subsystem réussit puis le programme ne démarre pas. Vous n'avez pas le message de subsystem, seulement ceci :

Connection closed.
Connection closed

sshd -t ne vérifie pas le chemin : testez donc le fichier sur le serveur :

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

Corrigez le chemin, installez le paquet manquant, ou passez à internal-sftp.

Le shell affiche quelque chose

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

SFTP lit les premiers octets de la sortie comme une longueur binaire : tout texte venant du shell le casse. Dans ce message, ces grands nombres sont les lettres du texte lues comme un nombre. Cherchez une sortie :

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

Tout résultat autre que 0 signifie qu'un fichier de démarrage comme ~/.bashrc affiche du texte. Mettez ceci en haut de ce fichier pour que la suite ne s'exécute que dans les shells interactifs :

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

Le compte a un shell nologin, ou une commande forcée

La même erreur Received message too long apparaît ici, car nologin ou un ForceCommand affiche du texte. Pour un utilisateur nologin, internal-sftp a fonctionné dans notre test, puisqu'il ne démarre pas le shell de l'utilisateur. Avec un ForceCommand, modifiez le réglage pour qu'il ne s'applique pas aux utilisateurs SFTP, ou définissez-le sur internal-sftp pour eux.

Questions

Que signifie subsystem request failed on channel 0 ?

La connexion a réussi, mais le serveur n'a pas de service SFTP configuré. Ajoutez Subsystem sftp internal-sftp à sshd_config et rechargez SSH.

Pourquoi ssh marche mais pas sftp ?

ssh n'a besoin que d'un shell, alors que sftp demande aussi au serveur de lancer son sous-système SFTP. Si la ligne Subsystem manque ou pointe vers un mauvais chemin, seuls les transferts de fichiers échouent.

scp a-t-il besoin du sous-système SFTP ?

Depuis OpenSSH 9.0, oui, il échoue donc de la même façon. scp -O utilise l'ancien protocole, qui s'en passe.

Sources

Autres guides : Messages d'erreur

Tous les guides