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ème | Chemin 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.