Comando scp Linux: copiare file da e verso un VPS (rsync, sftp)
- 14 novembre 2026
- 09:00
- Di Adrien Roche
- Tutorial

Il comando scp su Linux: sintassi e trasferimenti di base
scp (secure copy) copia file tra macchine tramite SSH, quindi utente, chiave e porta che funzionano con ssh funzionano anche con scp. La forma è sempre scp [options] SOURCE DESTINATION, e il lato remoto si scrive user@host:path. Serve un login SSH funzionante; se la porta 22 non risponde ancora, attiva SSH su Ubuntu e mettilo in sicurezza prima di procedere.
1. Da locale a remoto (upload)
scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/
Un percorso che termina con una barra deposita il file dentro quella directory con il nome originale; un percorso completo lo rinomina all'arrivo. Puoi indicare più file locali prima della destinazione, a patto che la destinazione sia una directory, e quella directory deve già esistere: scp non crea le directory superiori.
2. Da remoto a locale (download)
scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/
Il punto significa «qui, con lo stesso nome». Metti tra virgolette i caratteri jolly remoti, altrimenti la shell locale li espande. Funziona anche da remoto a remoto: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ instrada la copia attraverso la tua macchina, quindi solo la tua macchina ha bisogno delle credenziali per entrambi i server.
3. Directory con -r
scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup
-r copia una directory e tutto il suo contenuto. Il primo comando crea /var/www/site sul server; il secondo scarica l'intero albero nginx in una cartella locale. I link simbolici vengono copiati come file normali: un motivo in più per preferire rsync sugli alberi di sistema completi.
Le opzioni scp che userai davvero: -P, -i, -C, -p
scp -P 2222 file.txt user@SERVER_IP:/home/user/ # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/ # use a specific key
scp -C dump.sql user@SERVER_IP:~/ # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/ # keep times and modes
Il flag della porta è la P maiuscola, -P. La -p minuscola significa «preserva date di modifica, date di accesso e permessi» e, poiché ssh usa -p per la porta, confonderle è l'errore più comune con scp. Per non ripetere porta e chiave a ogni comando, definisci l'host una volta sola in ~/.ssh/config; scp, rsync e sftp lo leggono tutti:
Host vps
HostName SERVER_IP
User user
Port 2222
IdentityFile ~/.ssh/id_ed25519
Altri due flag: -l 8000 limita il trasferimento a 8.000 Kbit/s (circa 1 MB/s) e -v mostra quali chiavi vengono proposte quando l'autenticazione fallisce. Da OpenSSH 9.0 scp usa il protocollo SFTP sotto il cofano; la sintassi non cambia, ma i trucchi di shell inseriti in un percorso remoto (per esempio la sostituzione di comando) non vengono più eseguiti sul server, e -O ripristina il protocollo legacy per un server molto datato che rifiuta la nuova modalità.
rsync: mirror, trasferimenti riprendibili ed esclusioni
rsync copia solo ciò che è cambiato. La prima esecuzione si comporta come scp -r; quelle successive confrontano i due lati e inviano solo le differenze: i file nuovi e, per i file modificati, solo i blocchi cambiati. Questo lo rende lo strumento giusto per deploy, backup e qualsiasi trasferimento voluminoso. Deve essere installato su entrambi i lati (sudo apt install rsync); alcune immagini minimali e container non lo includono.
1. Il comando di tutti i giorni
rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/
-a (archive) equivale a -rlptgoD: ricorsione, link simbolici mantenuti come tali, permessi, date, gruppo, proprietario e file di dispositivo preservati; la proprietà viene mantenuta solo se il lato ricevente gira come root. -v elenca i file, -z comprime, --progress mostra ogni file.
La barra finale è decisiva. ./site/ significa «il contenuto di site»; ./site significa «la directory stessa», che creerebbe /var/www/site/site. Nel dubbio aggiungi -n (--dry-run) e leggi l'elenco dei file prima che venga scritto qualcosa.
2. Mirror con --delete
rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/ # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/
--delete rimuove dalla destinazione i file che non esistono più nella sorgente. Un vero mirror ne ha bisogno, ed è anche ciò che trasforma una barra finale sbagliata in una directory cancellata: fai sempre un dry-run la prima volta che scrivi un comando con --delete.
3. Escludere file
rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/
I pattern sono relativi alla radice del trasferimento; una barra iniziale li ancora, quindi /config.php esclude solo il file di primo livello. --exclude-from legge un pattern per riga.
4. Riprendere un trasferimento parziale, porta e chiave personalizzate
rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/
-P è l'abbreviazione di --partial --progress: se la connessione cade, il file parziale viene conservato e rilanciando lo stesso comando il trasferimento riprende dal punto in cui si era interrotto. Le opzioni SSH passano da -e, e qui la porta è la -p minuscola perché è il flag di ssh, non di rsync; una voce Host in ~/.ssh/config elimina l'intera stringa -e.
sftp: trasferimenti interattivi con lo stesso login SSH
sftp offre un prompt in stile FTP su SSH, comodo per esplorare prima di copiare.
sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye
I comandi che iniziano per l agiscono sulla tua macchina (lcd, lls, lpwd); gli altri agiscono sul server. put -r e get -r copiano directory, reget e reput riprendono un file interrotto e !command esegue un comando della shell locale senza uscire dalla sessione. sftp -b commands.txt user@SERVER_IP riesegue un file di questi comandi, utile per i cron job.
Copiare file da Windows: scp in PowerShell e WinSCP
Windows 10 (dalla 1809 in poi) e Windows 11 includono il client OpenSSH, quindi scp, sftp e ssh esistono in PowerShell con gli stessi flag di Linux:
cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads
Le chiavi si trovano in C:\Users\you\.ssh\ accanto a known_hosts, e anche ssh-keygen -R SERVER_IP funziona lì. I percorsi relativi dopo un cd evitano ogni confusione tra una lettera di unità e un hostname. rsync non è incluso; il modo più pulito per averlo è WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.
Per un'interfaccia grafica, WinSCP è la scelta abituale: parla SFTP e SCP, offre una vista a due pannelli con drag-and-drop e il suo comando Synchronize fa più o meno quello che fa rsync --delete. Si aspetta chiavi nel formato .ppk di PuTTY e propone di convertire una chiave OpenSSH quando la selezioni. Per tutto ciò che viene distribuito ripetutamente, una riga di scp o rsync in uno script è più facile da rileggere e automatizzare.
scp, rsync o sftp: quale usare
| Compito | Strumento migliore | Perché |
|---|---|---|
| Un file, una volta sola | scp | Comando più breve, niente da installare |
| Una directory, prima copia | scp -r o rsync -a | Risultato equivalente |
| Deploy o backup ripetuti | rsync | Vengono inviati solo i dati modificati |
| Mirror con cancellazioni | rsync --delete | scp non può rimuovere file |
| Riprendere un file di grandi dimensioni | rsync -P o reget di sftp | scp riparte da zero |
| Esplorare e poi scegliere i file | sftp o WinSCP | Elenco interattivo |
| Migliaia di file piccoli | rsync o tar su ssh | Con scp domina l'overhead per file |
| Windows senza WSL | scp in PowerShell o WinSCP | Nessun rsync nativo |
Regola pratica: scp quando puoi scrivere il comando a memoria, rsync non appena lo eseguirai due volte.
Consigli di velocità che fanno davvero la differenza
- La compressione non è gratuita.
-C(scp) e-z(rsync) riducono testo, dump SQL e log, ma sprecano CPU su archivi tar, immagini e video. Setopmostrasshdal 100% durante un trasferimento, togli il flag. - Raggruppa i file piccoli. I round trip per file dominano quando invii un albero di sorgenti; un unico flusso è più veloce:
tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'. - Prova un altro cifrario sui collegamenti veloci. Quando il collo di bottiglia è il processo ssh stesso,
scp -c aes128-gcm@openssh.comsfrutta le istruzioni AES presenti in quasi tutte le CPU moderne. - Proteggi i trasferimenti lunghi. Eseguili dentro
tmuxoscreencosì una sessione caduta non interrompe la copia, oppure usarsync -Pe rilancia. - Verifica e limita la banda.
sha256sum filedeve dare lo stesso risultato sui due lati;scp -lorsync --bwlimitevitano che un backup affami l'applicazione.
Permessi, proprietà ed errori frequenti
Permission denied sul percorso di destinazione
scp: /var/www//html/: Permission denied significa che il login è riuscito ma quell'utente non può scrivere lì. Copia nella tua home e sposta i file con sudo mv, assegna all'utente la proprietà della destinazione (sudo chown -R user:user /var/www/site), oppure con rsync aggiungi --rsync-path="sudo rsync", che funziona quando l'utente di login ha sudo senza password, come configurato in creare un utente con diritti sudo su Linux. Caricare come root evita l'errore ma lascia file di proprietà di root che un web server non può scrivere: esegui poi sudo chown -R www-data:www-data /var/www/site.
Permission denied (publickey)
Il server ha rifiutato l'autenticazione. Controlla il nome utente, forza la chiave con -i, aggiungi -v; sul VPS, sudo journalctl -u ssh -n 30 indica il motivo.
Remote host identification has changed
È previsto dopo una reinstallazione o un cambio di IP: la chiave host non corrisponde più a ~/.ssh/known_hosts. Se hai effettivamente ricreato il server, esegui ssh-keygen -R SERVER_IP e riconnettiti. In caso contrario, scopri il motivo prima di digitare una password da qualche parte.
No such file or directory
scp non crea le directory superiori: esegui prima ssh user@SERVER_IP 'mkdir -p /var/www/site'. rsync crea solo l'ultimo componente del percorso (--mkpath, da rsync 3.2.3, crea anche i livelli superiori).
rsync: command not found, oppure protocol data stream (code 12)
rsync manca su uno dei due lati; installalo con sudo apt install rsync e riprova.
Script caricati che si rifiutano di partire
I file provenienti da Windows non hanno il bit di esecuzione e spesso portano fine riga CRLF, che produce bad interpreter: No such file or directory. Risolvi entrambe le cose con chmod +x deploy.sh e sed -i 's/\r$//' deploy.sh; il lato shebang è trattato in cos'è un file .sh e come bash lo esegue. Un ultimo classico: scp file.txt user@SERVER_IP senza i due punti dopo l'host è una copia locale che crea silenziosamente un file chiamato user@SERVER_IP.
Tutto questo presuppone un server raggiungibile via SSH come root o come utente sudo, dove il limite è il trasferimento stesso e non una quota. Un VPS Linux di rdp.monster è una macchina di questo tipo: accesso root completo, CPU e RAM dedicate, banda illimitata (fair-use), niente KYC, criptovalute accettate, a partire da $8.99 al mese, e il server è online circa 10 secondi dopo la conferma del pagamento, così la prima cosa che ci esegui può essere lo scp del primo passaggio.
Domande frequenti
Il comando scp è deprecato?
scp sposta i file tramite SFTP. Il comando, i suoi flag e la sintassi user@host:path restano invariati, quindi gli script esistenti continuano a funzionare; cambia solo il comportamento dell'espansione della shell nei percorsi remoti, e -O ripristina il protocollo legacy per i server che ne hanno bisogno. Per una nuova automazione rsync o sftp sono scelte più complete, ma scp va benissimo per le copie occasionali.Posso usare scp con una password invece di una chiave SSH?
PasswordAuthentication yes, scp chiede la password e la copia procede; non esiste un flag per passare la password sulla riga di comando, e strumenti come sshpass che lo fanno la lasciano nella cronologia della shell. I server induriti di solito disabilitano il login con password: in quel caso scp fallisce con Permission denied (publickey) finché non installi una chiave con ssh-copy-id. Le chiavi sono anche ciò che permette agli script di girare senza intervento.scp sovrascrive i file esistenti senza chiedere?
-n (--dry-run) stampa cosa cambierebbe, --ignore-existing lascia intatti i file già presenti, --update salta i file più recenti sulla destinazione e --backup --backup-dir=DIR conserva le versioni sostituite. Per tutto ciò che è insostituibile, copia in una directory nuova e poi scambiala.Come copio file direttamente tra due server VPS?
rsync -avz /data/ user@OTHER_IP:/data/ (oppure scp -r), così i dati non passano dalla tua connessione domestica. Questo richiede che il primo server abbia una chiave accettata dal secondo. Se preferisci non mettere chiavi sui server, scp -3 user@HOST_A:/path user@HOST_B:/path copia attraverso la tua macchina usando solo le tue credenziali locali, al costo di scaricare e ricaricare tutto una volta.Adrien Roche, Editor infrastruttura e hosting
Ingegnere di sistemi con oltre 10 anni di esperienza su parchi server Windows Server e Linux. Adrien cura la documentazione dell'infrastruttura di rdp.monster e scrive le nostre guide su RDP, hosting VPS, amministrazione server, networking e strumenti per la privacy.




