RDP Monster

Comando scp Linux: copiare file da e verso un VPS (rsync, sftp)

Comando scp Linux: copiare file da e verso un VPS (rsync, sftp)

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

CompitoStrumento migliorePerché
Un file, una volta solascpComando più breve, niente da installare
Una directory, prima copiascp -r o rsync -aRisultato equivalente
Deploy o backup ripetutirsyncVengono inviati solo i dati modificati
Mirror con cancellazionirsync --deletescp non può rimuovere file
Riprendere un file di grandi dimensionirsync -P o reget di sftpscp riparte da zero
Esplorare e poi scegliere i filesftp o WinSCPElenco interattivo
Migliaia di file piccolirsync o tar su sshCon scp domina l'overhead per file
Windows senza WSLscp in PowerShell o WinSCPNessun 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. Se top mostra sshd al 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.com sfrutta le istruzioni AES presenti in quasi tutte le CPU moderne.
  • Proteggi i trasferimenti lunghi. Eseguili dentro tmux o screen così una sessione caduta non interrompe la copia, oppure usa rsync -P e rilancia.
  • Verifica e limita la banda. sha256sum file deve dare lo stesso risultato sui due lati; scp -l o rsync --bwlimit evitano 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 non è stato rimosso, ma da OpenSSH 9.0 trasferisce tramite il protocollo SFTP perché il protocollo scp originale è stato dichiarato obsoleto.
Gli sviluppatori di OpenSSH hanno descritto il protocollo scp/rcp originale come obsoleto e difficile da mettere in sicurezza e, da OpenSSH 9.0 (2022), il comando 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?

Sì, se il server consente ancora l'autenticazione con password; scp la richiede esattamente come fa ssh.
scp usa la stessa autenticazione che ssh userebbe per quell'host. Se sshd ha 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?

Sì: scp e rsync sostituiscono entrambi i file sulla destinazione senza avvisare, quindi nel dubbio fai un'anteprima con rsync --dry-run.
scp sovrascrive qualsiasi file con lo stesso nome sulla destinazione senza chiedere conferma e senza opzioni per saltarlo. Anche rsync sovrascrive, ma solo quando la sorgente è diversa, e ti dà il controllo: -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?

Esegui rsync o scp su un server puntando all'altro, oppure usa scp -3 per instradare la copia attraverso la tua macchina.
La via più rapida è da server a server: collegati via ssh al VPS sorgente ed esegui 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.

Iscriviti al nostro programma rivenditori

I tuoi dati

Se hai domande, contattaci cliccando qui !
Nome completo(Obbligatorio)
Inserisci la tua email: ti serve un account su dashboard.rdp.monster !

La tua azienda

Inserisci l'indirizzo del tuo sito web, se ne hai uno
Spiegaci in due righe come venderai i servizi ai tuoi clienti. Per esempio, parlandone sui forum.

Anche i mostri adorano i cookie!

Usiamo i cookie per migliorare la tua navigazione, mostrarti annunci o contenuti personalizzati e analizzare il nostro traffico. Cliccando su «Accetta» acconsenti all'uso dei cookie.