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

Il server ha accettato il tuo login ma non ha un servizio SFTP configurato, quindi è un'impostazione del server e non un problema di password o chiave. Aggiungi Subsystem sftp internal-sftp a /etc/ssh/sshd_config, controllalo con sudo sshd -t e ricarica il servizio SSH. Se hai solo scp e non puoi cambiare il server, scp -O usa il vecchio protocollo, che non richiede il subsystem.

Aggiornata il . Riprodotto con OpenSSH 10.3 su macOS (sftp e scp) verso un server OpenSSH 10.0 usa e getta su Debian 13, per ciascun caso qui sotto.

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:

SistemaPercorso 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.

Fonti

Altro in Messaggi di errore

Tutte le guide