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.