Comando sftp in Linux: trasferire file tramite SSH
sftp è il client OpenSSH per trasferire e gestire file tramite SSH (Secure Shell), con una connessione cifrata e la verifica dell’identità del server. SFTP significa SSH File Transfer Protocol: per collegarsi si usa sftp user@host, quindi get scarica i file e put li carica.
sftp user@example.com
SFTP è diverso da FTP e da FTPS, anche se i nomi sono simili. Il server deve offrire il sottosistema SFTP di SSH e normalmente usa la stessa porta TCP del servizio SSH. Negli esempi, example.com e i suoi sottodomini sono segnaposto: sostituisci utente, server, porta e percorsi con quelli di un sistema a cui sei autorizzato ad accedere.
Caratteristiche di SFTP e verifiche prima della connessione
Il client sftp di OpenSSH supporta l’autenticazione con chiave pubblica, la configurazione SSH e i server intermedi, detti jump host. Il manuale ufficiale di sftp descrive le opzioni e i comandi interattivi. Se devi orientarti anche fra gli altri strumenti della shell, consulta la guida ai comandi Linux essenziali. Prima di collegarti, prepara:
- Indirizzo del server e porta SSH
- Account utente per il login
- Password o chiave privata SSH
- Un canale attendibile da cui ottenere l’impronta della chiave host del server
- Permessi di lettura e scrittura per la directory remota
Confronta l'impronta digitale della chiave host visualizzata al primo collegamento con il valore ricevuto dall'amministratore del server o da un'interfaccia di gestione affidabile. Se la approvi senza verificarla, potresti non accorgerti di un attacco man-in-the-middle o di esserti collegato al server sbagliato.
Come collegarsi al server
Connessione di base
sftp user@example.com
Dopo la connessione compare il prompt sftp>. Inserisci lì i comandi interattivi come get e put; avvia invece sftp dalla shell locale. I blocchi seguenti mostrano i comandi da digitare senza includere il prompt.
Usare una porta SSH diversa
sftp -P 2222 user@example.com
La porta si specifica con -P maiuscola. L’opzione -p minuscola ha un’altra funzione: conserva date di modifica e accesso e permessi dei file trasferiti, nei limiti consentiti dal sistema di destinazione.
Specificare una chiave privata
sftp -i ~/.ssh/id_ed25519 user@example.com
Proteggi la chiave privata con permessi che ne impediscano la lettura ad altri utenti e, quando possibile, con una passphrase e un agente SSH. -i indica il file della chiave privata sul computer locale; non copiarla sul server o in directory condivise. La chiave pubblica corrispondente deve essere autorizzata per l’account remoto.
Distinguere percorsi locali e remoti
La sessione SFTP mantiene una directory corrente remota e una locale distinte. Il prefisso l identifica molti dei comandi che operano sul computer locale.
| Comando | Destinazione | Descrizione |
|---|---|---|
pwd |
Remoto | Visualizza la directory corrente del server remoto. |
lpwd |
Locale | Visualizza la directory corrente del computer su cui è in esecuzione SFTP. |
cd percorso |
Remoto | Cambia la directory remota. |
lcd percorso |
Locale | Cambia la directory locale. |
ls |
Remoto | Visualizza l'elenco dei file remoti. |
lls |
Locale | Visualizza l'elenco dei file locali. |
mkdir |
Remoto | Crea una directory remota; il percorso padre deve esistere. |
lmkdir |
Locale | Crea una directory locale; il percorso padre deve esistere. |
Controlla pwd e lpwd prima dei trasferimenti. I percorsi relativi vengono risolti rispetto alla directory corrente del rispettivo lato; un percorso remoto può inoltre essere limitato a un ambiente isolato dal server e non coincidere con il percorso visto da un amministratore. Nella tabella, percorso è un segnaposto da sostituire con la directory desiderata.
Scaricare file
Scaricare un singolo file
get reports/daily.csv
Il secondo argomento indica il nome o il percorso locale di destinazione. Nel secondo esempio la directory locale ./download deve già esistere; senza una destinazione esplicita, il file viene salvato nella directory indicata da lpwd.
get reports/daily.csv ./download/daily.csv
Scaricare più file e directory
get reports/*.csv
get -R reports
Il primo comando scarica i file remoti che corrispondono a reports/*.csv; il secondo copia ricorsivamente la directory reports. In OpenSSH, get -R non segue i collegamenti simbolici incontrati nella directory. Controlla i nomi già presenti sul lato locale: un normale download può sovrascriverli. Per client diversi o meno recenti, verifica le opzioni disponibili nel relativo manuale.
Riprendere un download interrotto
reget archive.tar.zst
Anche get -a tenta di riprendere un download. Il file locale parziale deve corrispondere esattamente all’inizio del file remoto; se il remoto è cambiato o il parziale appartiene a un’altra versione, il risultato può essere corrotto anche con un codice di uscita pari a zero. In caso di dubbio conserva il parziale con un altro nome e scarica di nuovo il file completo. Per dati importanti confronta un hash affidabile, per esempio SHA-256, dopo il trasferimento.
Caricare file
Caricare un singolo file
put ./release.tar.zst
Senza una destinazione esplicita, il file viene caricato nella directory remota indicata da pwd. Il secondo argomento consente di scegliere un nome o percorso remoto; nell’esempio, uploads deve esistere ed essere scrivibile dall’account usato.
put ./release.tar.zst uploads/release.tar.zst
Caricare una directory ricorsivamente
put -R ./assets uploads/assets
Il comando carica la directory locale assets sotto uploads/assets; la directory remota uploads deve già esistere. La copia ricorsiva di OpenSSH non segue i collegamenti simbolici incontrati. File già presenti possono essere sovrascritti: controlla il percorso e conserva una versione recuperabile prima di aggiornare dati condivisi. Un caricamento con nome temporaneo seguito da una rinomina può aiutare la distribuzione, ma richiede le condizioni descritte nell’esempio batch.
Riprendere un caricamento interrotto
reput ./large-image.img
put -a tenta anch’esso la ripresa. Il file remoto parziale deve corrispondere all’inizio del file locale: non usare la ripresa per aggiornare una versione diversa. Se non puoi verificarne la corrispondenza, carica nuovamente il file completo con un nome distinto e controllane l’hash prima di sostituire la versione in uso.
Gestire percorsi e nomi con spazi
Racchiudi tra virgolette i percorsi che contengono spazi. Anche in questi esempi le directory remote e locali devono già esistere.
get "Monthly Reports/September Report.csv"
put "./Release Files/app package.tar.zst" uploads/
Il parser dei comandi SFTP non è una shell Bash: non aspettarti che espressioni della shell, variabili o sequenze di comandi funzionino allo stesso modo. Nomi contenenti caratteri jolly o barre inverse richiedono le regole di escape del client; controlla prima il nome con ls o lls. Per i processi automatici preferisci nomi semplici e prevedibili.
Salvare la connessione nella configurazione SSH
Raggruppare le opzioni in una voce Host
Aggiungi una voce Host al file locale ~/.ssh/config, conservando le voci esistenti. Sostituisci i valori di esempio con quelli del tuo server. L’alias fileserver permette poi di richiamare insieme nome del server, utente, porta e chiave:
Host fileserver
HostName sftp.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
sftp fileserver
Non inserire password o il contenuto di chiavi private nella configurazione. IdentityFile indica un percorso; IdentitiesOnly yes limita le identità offerte a quelle configurate, invece di provare indiscriminatamente quelle dell’agente. Per la maggior parte delle direttive vale il primo valore trovato: opzioni della riga di comando, configurazione utente e poi configurazione di sistema. Metti quindi le sezioni Host specifiche prima dei valori generali; alcune direttive, come IdentityFile, possono accumulare più valori. Vedi le regole nel manuale di ssh_config.
Collegarsi tramite un jump host
sftp -J bastion.example.com user@internal.example.com
-J usa ProxyJump: il collegamento passa attraverso il jump host e raggiunge il server finale. Servono accesso autorizzato al primo host e connettività consentita verso il secondo. Verifica le chiavi host di entrambi; questa modalità non richiede di per sé l’inoltro dell’agente SSH, che va abilitato solo se necessario e secondo la policy.
Automatizzare i trasferimenti in modalità batch
Preparare il file batch
Prepara una directory locale exports contenente report.csv e una directory remota incoming, già esistente e scrivibile. Avvia il comando dalla directory locale che contiene exports; incoming viene risolta rispetto alla directory remota iniziale. Salva questi comandi nel file locale upload.sftp:
cd incoming
lcd ./exports
put report.csv report.tmp
rename report.tmp report.csv
bye
Il risultato atteso è incoming/report.csv completo, senza report.tmp residuo dopo una rinomina riuscita. Il nome temporaneo riduce il rischio che un consumatore legga un file ancora in caricamento, purché quel consumatore ignori i nomi temporanei. In produzione scegli un nome temporaneo distinto per ogni esecuzione, per evitare collisioni fra trasferimenti concorrenti.
L’atomicità della rinomina e la possibilità di sostituire un file già esistente dipendono dal server, dal filesystem e dalle estensioni supportate. Questo esempio mantiene i due nomi nella stessa directory; verifica prima il comportamento sul tuo server e conserva una versione precedente recuperabile. Non rimuovere preventivamente il file definitivo dando per scontato che la rinomina riuscirà. Una rinomina atomica non garantisce da sola la persistenza dei dati dopo un’interruzione di alimentazione.
Eseguire il file batch
sftp -b upload.sftp fileserver
L’alias fileserver deve essere configurato e la chiave host verificata in precedenza. L’autenticazione deve riuscire senza richieste interattive: una chiave protetta può richiedere un agente già sbloccato e disponibile al processo, anche quando questo è eseguito da uno scheduler. Usa un account dedicato con privilegi minimi e limita chiave, origini e percorsi secondo la policy del server. Non inserire password negli script o sulla riga di comando.
Gestire gli errori
Con OpenSSH, in modalità batch un errore di comandi come get, put o rename interrompe l’esecuzione: non trattare le righe successive come già eseguite. Il prefisso - sul singolo comando ne ignora l’errore e consente di continuare. Usalo soltanto per operazioni realmente facoltative, perché può produrre un esito complessivo riuscito pur con file mancanti.
Controlla il codice di uscita del processo SFTP, la presenza e la dimensione dei file finali e, quando possibile, i checksum. Un file con dimensione corretta può comunque avere contenuto diverso. Prevedi notifiche, tentativi successivi che non sovrascrivano dati validi e una procedura di recupero per i file temporanei rimasti dopo un errore.
Verifiche di sicurezza e gestione
- Chiave host: Verifica l’impronta tramite un canale attendibile al primo accesso e in caso di cambiamenti.
- Autenticazione: Per l’automazione usa un account dedicato e una chiave autorizzata con privilegi limitati.
- Chiave privata: Limita i permessi di lettura e non copiarla sul server o in archivi e cartelle di backup condivisi.
- Permessi sui percorsi: Limita l’account alle directory necessarie secondo le possibilità del server.
- Sovrascrittura: Controlla percorso e file esistenti; usa nomi temporanei distinti e conserva versioni recuperabili.
- Integrità: Per i file importanti confronta checksum ottenuti in modo affidabile sui due lati.
- Log: Registra destinazioni ed esiti dei trasferimenti, evitando password, chiavi private e contenuti sensibili.
Confronto fra sftp, scp e rsync
| Strumenti | Situazioni adatte | Caratteristiche |
|---|---|---|
sftp |
Gestione interattiva dei file e trasferimento standardizzato | Fornisce elenchi remoti, navigazione nelle directory, ripresa e comandi batch. |
scp |
Copia semplice dei file | Copia con una singola riga di comando, senza l’interfaccia interattiva di gestione di sftp. |
rsync |
Sincronizzazione ripetuta e grandi directory | Trasferisce differenze e supporta esclusioni; la cancellazione dei file di destinazione richiede opzioni esplicite. Con trasporto SSH serve rsync anche sul lato remoto: non usa il protocollo SFTP. Il manuale ufficiale di rsync descrive trasporti e opzioni. |
Nelle versioni attuali di OpenSSH, anche scp usa SFTP come protocollo predefinito; l’opzione -O seleziona il vecchio protocollo SCP. La differenza pratica della tabella riguarda soprattutto l’interfaccia e il tipo di operazione: vedi il manuale ufficiale di scp. La cifratura SSH non sostituisce una corretta gestione di permessi, versioni e recupero in caso di errore.
Domande frequenti
SFTP è FTP con TLS applicato?
No. SFTP, SSH File Transfer Protocol, usa il trasporto SSH. FTPS applica invece TLS a FTP: richiede un servizio e una configurazione differenti e non è intercambiabile con SFTP.
Perché si verifica un errore Connection refused?
L’indirizzo o la porta potrebbero essere errati, il servizio SSH potrebbe non essere in ascolto oppure un firewall potrebbe rifiutare la connessione. Controlla l’indirizzo del server, la porta indicata con -P maiuscola, lo stato del servizio SSH e le regole di rete.
Cosa devo fare se appare Permission denied?
Occorre distinguere un errore di autenticazione dalla mancanza di permessi sui file dopo l’accesso. Esamina le informazioni diagnostiche con sftp -v, ma non pubblicare log contenenti nomi utente, percorsi o dettagli del server.
Come verifico che l'upload sia completo?
Controlla il codice di uscita, il nome finale e la dimensione remota; per i file importanti confronta hash SHA-256 calcolati su entrambi i lati o un hash di origine attendibile. Un account SFTP limitato può non consentire l’esecuzione di comandi per calcolare un hash: in quel caso serve una procedura lato server o un’API di verifica autorizzata.
Riepilogo
Dopo la connessione con sftp user@host, usa get per scaricare e put per caricare. Controllare pwd e lpwd e distinguere cd da lcd riduce gli errori fra percorsi remoti e locali.
Per automatizzare i trasferimenti servono autenticazione predisposta, verifica della chiave host, controllo degli errori del batch e verifica dell’integrità. Mantieni le password fuori dagli script e limita l’account e i percorsi alle sole operazioni necessarie.




