Cosa vedi
$ sftp user@server
subsystem request failed on channel 0
Connection closed
scp usa lo stesso servizio da OpenSSH 9.0, quindi fallisce anche lui:
subsystem request failed on channel 0
scp: Connection closed
Il semplice ssh user@server funziona ancora, perché manca solo la parte SFTP.
Controlla il server
sudo sshd -T | grep -i '^subsystem'
Nessun output significa che non è definito nessun subsystem, che è il comportamento predefinito di OpenSSH quando la riga manca. Succede spesso dopo che qualcuno sostituisce sshd_config con una versione corta e rinforzata, o quando la riga è stata commentata. sshd -t non ti avvisa di questo.
La soluzione
Aggiungi una di queste righe a /etc/ssh/sshd_config, fuori da qualsiasi blocco Match. La prima esegue SFTP dentro sshd e non richiede un programma separato:
Subsystem sftp internal-sftp
Oppure la forma classica, con il percorso per il tuo sistema:
Subsystem sftp /usr/lib/openssh/sftp-server
Percorsi comuni:
| Sistema | Percorso di sftp-server |
|---|---|
| Debian, Ubuntu | /usr/lib/openssh/sftp-server |
| RHEL, Fedora, Rocky, Alma | /usr/libexec/openssh/sftp-server |
| Alpine | /usr/lib/ssh/sftp-server, dal pacchetto openssh-sftp-server |
Poi convalida e ricarica. Il servizio si chiama ssh su Debian e Ubuntu e sshd sui sistemi di tipo Red Hat:
sudo sshd -t && sudo systemctl reload ssh
Tieni aperta la sessione attuale finché un nuovo login non funziona.
Con la riga al suo posto, sftp funziona come sempre. Per l'uso quotidiano vedi i comandi sftp con esempi.
Su un NAS o un router
Questi apparecchi attivano SFTP nelle loro impostazioni, non in sshd_config. Su un NAS Synology, attiva il servizio SFTP in Pannello di controllo, Servizi file, FTP. Su OpenWrt, SFTP richiede il pacchetto openssh-sftp-server.
Un'alternativa quando non puoi cambiare il server
Per copiare file, di' a scp di usare il vecchio protocollo, che non richiede nessun subsystem:
scp -O file.txt user@server:/tmp/
Puoi anche passare i dati in pipe su SSH semplice, dato che il login funziona:
tar -cf - folder | ssh user@server 'tar -xf - -C /tmp'
Messaggi simili, cause diverse
Il percorso è sbagliato
Quando la riga esiste ma il programma non c'è, la richiesta del subsystem riesce e poi il programma non si avvia. Non ottieni il messaggio sul subsystem, solo questo:
Connection closed.
Connection closed
sshd -t non controlla il percorso, quindi verifica il file sul server:
sudo sshd -T | grep -i '^subsystem'
ls -l /usr/lib/openssh/sftp-server
Correggi il percorso, installa il pacchetto mancante o passa a internal-sftp.
La shell stampa qualcosa
Received message too long 1466264675
Ensure the remote shell produces no output for non-interactive sessions.
SFTP legge i primi byte dell'output come una lunghezza binaria, quindi qualsiasi testo dalla shell lo rompe. In questo messaggio, quei numeri grandi sono le lettere del testo lette come un numero. Controlla se c'è output:
ssh user@server /bin/true | wc -c
Qualsiasi valore diverso da 0 significa che un file di avvio come ~/.bashrc stampa qualcosa. Metti questo all'inizio di quel file, così il resto viene eseguito solo nelle shell interattive:
case $- in
*i*) ;;
*) return ;;
esac
L'account ha una shell nologin o un comando forzato
Qui compare lo stesso errore Received message too long, perché nologin o un ForceCommand stampa del testo. Per un utente nologin, nel nostro test internal-sftp ha funzionato, dato che non avvia la shell dell'utente. Con un ForceCommand, cambia l'impostazione in modo che non si applichi agli utenti SFTP, oppure impostala su internal-sftp per loro.
Domande
Cosa significa subsystem request failed on channel 0?
L'accesso è riuscito, ma sul server non c'è un servizio SFTP configurato. Aggiungi Subsystem sftp internal-sftp a sshd_config e ricarica SSH.
Perché ssh funziona e sftp no?
ssh ha bisogno solo di una shell, mentre sftp chiede anche al server di avviare il sottosistema SFTP. Se la riga Subsystem manca o punta a un percorso sbagliato, falliscono solo i trasferimenti di file.
scp ha bisogno del sottosistema SFTP?
Da OpenSSH 9.0 sì, quindi fallisce allo stesso modo. scp -O usa il vecchio protocollo, che funziona anche senza.