Comando scp: uso e opzioni, copiare cartelle e indicare la porta
scp è lo strumento di copia che si usa per scambiare file con un server a cui ti connetti tramite SSH. Quando invii un file con il comando scp, scrivi prima l'origine e poi la destinazione, come con cp. Inviando file e cartelle da un server AlmaLinux 9 a un server Debian 12 e recuperandoli, il trasferimento è avvenuto tramite il protocollo SFTP e un file da 20MB è arrivato in meno di 1 secondo.
Tutto l'output qui sotto è il risultato esatto di scp di OpenSSH 9.9 eseguito con l'account root sul lato mittente. Sono stati cambiati con valori di esempio solo gli indirizzi dei server e i nomi degli account.
1️⃣ Uso di scp e percorsi remoti
Davanti a un percorso del server remoto si mette [account@indirizzo del server:]. Un percorso senza due punti viene considerato un percorso del server dove esegui il comando, quindi il lato con i due punti stabilisce se stai inviando o ricevendo.
Invia report.txt dalla cartella corrente alla cartella scp-test nella home del server remoto.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00Al termine del trasferimento compaiono su una riga nome del file, avanzamento, dimensione, velocità e tempo impiegato. Questo indicatore di avanzamento compare solo quando esegui in un terminale. Per questo, se reindirizzi l'output su un file, nel file non resta nulla.
Per ricevere, scrivi prima il percorso remoto e poi il percorso locale in cui salvare.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Se il percorso di destinazione termina con il nome di un file invece che con una cartella, il file viene salvato con quel nome. Dopo l'invio con il comando qui sotto, nella cartella del lato ricevente report.txt si trovava con il nome report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Simulatore del comando scp
Nel simulatore qui sotto puoi digitare tu stesso i comandi di invio, ricezione e copia di cartelle e controllare l'output di ogni opzione.
2️⃣ Opzioni del comando scp
Le opzioni vanno subito dopo scp, prima dell'origine. -P, che indica la porta, è maiuscola, mentre -p minuscola conserva orari e permessi, quindi se scambi maiuscola e minuscola viene eseguita un'altra azione.
-l imposta il limite della velocità di trasferimento in Kbit/s. Senza opzioni, un file da 20MB è stato trasferito in meno di 1 secondo.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 corrisponde a circa 1,000KB al secondo. Inviando lo stesso file con -l 8000, l'indicatore di avanzamento ha mostrato 996.5KB/s e il trasferimento ha richiesto 20 secondi.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C comprime i dati sulla connessione SSH con lo stesso metodo di gzip. Abbiamo inviato tre volte ciascuno un file di log da 19MB con frasi ripetute, e tra questi due server gli invii con -C sono stati un po' più lenti.
| Comando | File | Tempo di esecuzione | Velocità dell'indicatore di avanzamento |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 s | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 s | 996.5KB/s |
| scp access.log (3 volte) | 19MB | 0.79~0.89 s | — |
| scp -C access.log (3 volte) | 19MB | 0.84~0.97 s | — |
Il tempo di esecuzione va dall'avvio del comando alla connessione e alla fine del trasferimento. Anche il manuale di ssh spiega che la compressione aiuta sulle linee lente e rallenta il trasferimento sulle reti veloci.
-v mostra il processo dalla connessione al trasferimento in righe debug1, quindi serve a trovare la causa quando la connessione non riesce o si blocca all'autenticazione. L'output è lungo, perciò con grep abbiamo selezionato solo le righe di autenticazione e trasferimento.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsLa riga [Sending subsystem: sftp] significa che scp ha inviato il file con il protocollo SFTP. Da OpenSSH 9.0, scp usa SFTP per impostazione predefinita. Con -O trasferisce con il vecchio protocollo SCP e nello stesso punto compare [Sending command: scp -v -t].
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Opzioni principali: risultati di questo articolo
| Opzione | Compito | Risultato in questo articolo | |
|---|---|---|---|
| -P | Indica la porta di connessione SSH | Porta 22: invio di report.txt completato; porta chiusa 2222: terminato con [Connection timed out] | |
| -i | Indica il file di chiave privata per l'autenticazione a chiave pubblica | Invio di report.txt completato indicando ~/.ssh/id_ed25519 | |
| -r | Copia i file e le sottocartelle della cartella | Sul lato ricevente restano le cartelle css e images con la struttura originale; senza l'opzione, l'errore [not a regular file] blocca il trasferimento | |
| -p | Conserva l'orario di modifica, l'orario di accesso e i permessi dell'origine | Orario di modifica conservato; sul lato ricevente di questo articolo, il permesso 600 è rimasto solo nel file inviato con -O -p | |
| -C | Comprime i dati sulla connessione SSH | Con il log da 19MB tra i due server di questo articolo, l'invio con l'opzione è stato un po' più lento | |
| -l | Imposta il limite della velocità di trasferimento in Kbit/s | Con -l 8000, 20MB a 996.5KB/s in 20.82 secondi | |
| -v | Mostra il processo dalla connessione al trasferimento in righe debug1 | Trasferimento SFTP confermato dalla riga [Sending subsystem: sftp] | |
| -3 | Trasferisce i dati tra due server remoti passando dal server che esegue il comando (predefinito da OpenSSH 8.7) | Invio di report.txt completato con due cartelle dello stesso server come origine e destinazione | |
| -O | Trasferisce con il vecchio protocollo SCP | Nell'output di -v compare [Sending command: scp -v -t]; i percorsi con spazi richiedono una barra rovesciata in più | |
| -o | Passa a ssh un'opzione in formato ssh_config | Attesa impostata a 10 secondi con ConnectTimeout=10 e [Connection timed out] confermato |
📎 Altre opzioni: secondo il manuale ufficiale
| Opzione | Compito | |
|---|---|---|
| -q | Disattiva l'indicatore di avanzamento e gli avvisi e i messaggi diagnostici di ssh | |
| -J | Si connette prima a un jump host e da lì imposta l'inoltro TCP fino alla destinazione finale (forma abbreviata dell'impostazione ProxyJump; più hop si separano con virgole) | |
| -F | Indica un altro file come file di configurazione utente di ssh (passato direttamente a ssh) | |
| -4 | Forza l'uso dei soli indirizzi IPv4 | |
| -6 | Forza l'uso dei soli indirizzi IPv6 |
3️⃣ Copiare cartelle con scp e conservare gli orari
Se indichi una cartella senza opzioni, scp mostra un errore che dice che non è un file normale e non esegue il trasferimento.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/Con -r vengono copiati i file e le sottocartelle della cartella.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00L'output mostra solo i nomi dei file. Nell'output di find sul lato ricevente, le cartelle css e images si trovavano in site-files con la struttura originale.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r segue i link simbolici nella cartella e copia i file originali, quindi per le cartelle in cui i link devono restare link è più adatto rsync -a.
-p conserva l'orario di modifica, l'orario di accesso e i permessi dell'origine. Prima dell'invio abbiamo impostato il report.txt originale con orario di modifica 1 ottobre 2026 00:00 (UTC) e permessi 600. Il fuso orario del server ricevente è UTC, perciò anche ls sul lato mittente è stato eseguito con TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt, inviato con -p, e report-Op.txt, inviato con -O -p, hanno conservato l'orario originale, mentre report.txt, inviato senza opzioni, è stato salvato con l'orario di invio. Sul server ricevente i file inviati tramite SFTP sono stati salvati con permessi 664 anche con -p, e solo il file inviato con il vecchio protocollo SCP (-O) ha mantenuto 600.
Per questo, nei file i cui permessi devono coincidere con l'origine, dopo l'invio controlla i permessi con ls -l sul lato ricevente.
4️⃣ Indicare porta e file di chiave in scp
Sui server che non accettano la connessione con la porta 22 e la chiave predefinite, indica porta e chiave prima dell'invio. -P indica la porta di connessione SSH e -i il file di chiave privata per l'autenticazione a chiave pubblica.
Qui sotto c'è un esempio che indica direttamente la porta 22 e un file di chiave. Su un server con la porta cambiata, scrivi quel numero al posto di 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Senza -i, come ssh, usa a turno le chiavi con nomi predefiniti in ~/.ssh (id_rsa, id_ecdsa, id_ed25519 ecc.).
Se invii spesso allo stesso server, scrivi un alias in ~/.ssh/config e in scp digita solo l'alias.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519Il nome sulla riga Host diventa l'alias, e le quattro righe sottostanti sostituiscono indirizzo del server, account, porta e file di chiave. Anche il comando con il solo alias è terminato con lo stesso risultato di una riga ottenuto scrivendo indirizzo e chiave per intero.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i e gli alias usano tutti le impostazioni di connessione ssh così come sono, quindi anche creare una chiave e registrarla sul server funziona come quando ti connetti con il comando SSH.
5️⃣ Copia tra server con scp
Anche quando origine e destinazione sono entrambe server remoti, basta una riga di scp. Da OpenSSH 8.7 i dati vengono trasferiti passando dal server che esegue il comando, e questo metodo è -3. Le note di rilascio ufficiali indicano come motivo del nuovo metodo predefinito il fatto di non dover tenere le credenziali del server di destinazione sul server di origine.
La misurazione qui sotto è stata eseguita con due cartelle dello stesso server come origine e destinazione. Se il server di destinazione è diverso, cambia solo l'account e l'indirizzo alla fine.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00È come se la sede centrale ricevesse i documenti tra due filiali e li rispedisse.
Il vecchio metodo, in cui il server di origine invia direttamente al server di destinazione, si indica con -R. Questo metodo richiede che il server di origine possa connettersi al server di destinazione senza password. Da OpenSSH 10.6 l'uso di -R mostra un avviso di deprecazione, e le versioni successive dovrebbero ignorare questa opzione e copiare con il metodo -3.
6️⃣ Confronto tra scp e rsync
Per inviare pochi file una volta basta scp, mentre per sincronizzare più volte la stessa cartella o riprendere un trasferimento interrotto è meglio il comando rsync. scp invia di nuovo tutti i file indicati a ogni esecuzione, mentre rsync confronta origine e destinazione e trasferisce solo i file modificati.
| Voce | scp | rsync |
|---|---|---|
| Ambito del trasferimento | Tutti i file indicati a ogni esecuzione | Solo i file modificati rispetto all'origine |
| Conservare i file ricevuti a metà (--partial) | ❌ | ✅ |
| Eliminare i file assenti nell'origine (--delete) | ❌ | ✅ |
| Link simbolici | Li segue e copia i file originali | Con -a restano link |
| Necessario sul lato ricevente | Accesso SSH e server SFTP | rsync installato su entrambi i lati |
7️⃣ Messaggi di errore del comando scp e soluzioni
Quando scp fallisce, la causa compare direttamente nella prima riga dell'output. Nei tre casi in cui abbiamo provocato apposta un errore con un file inesistente, i permessi di scrittura e una porta sbagliata, la causa è sempre comparsa nella prima riga e il codice di uscita non è mai stato 0.
🔲 No such file or directory
Se provi a ricevere un file che non esiste sul lato remoto, viene mostrato [No such file or directory] insieme al percorso.
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryIn invio, se la cartella di destinazione non esiste compare lo stesso errore. scp non crea le cartelle mancanti, quindi esegui prima mkdir -p tramite ssh per creare la cartella.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Se la cartella del lato ricevente non ha il permesso di scrittura, dopo [dest open] segue [Permission denied]. Qui sotto c'è il risultato dell'invio a una cartella readonly con permessi 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Se [account@indirizzo del server:] precede [Permission denied] e tra parentesi c'è un metodo di autenticazione come publickey, la connessione è stata rifiutata nella fase di autenticazione. Questa dicitura è il formato usato dal programma ssh quando l'autenticazione fallisce, quindi controlla prima il file di chiave indicato con -i e la chiave pubblica registrata sul server.
🔲 Connection timed out
Se il numero di porta è sbagliato o un firewall blocca quella porta e non arriva risposta, scp attende la connessione e termina con [Connection timed out]. Qui sotto c'è il risultato dell'invio alla porta chiusa 2222 con un'attesa di 10 secondi.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedSe compare questo errore, controlla prima che il numero scritto in -P corrisponda alla porta SSH del server.
🔲 Spazi e tilde (~) nei percorsi
Con lo scp attuale, che trasferisce tramite SFTP, basta racchiudere una sola volta tra virgolette semplici il percorso remoto con spazi.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Aggiungendo -O allo stesso comando per inviare con il vecchio protocollo SCP, l'invio è fallito con [ambiguous target]. Questo perché nel vecchio protocollo SCP la shell remota interpreta il percorso una volta in più.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetIn questo caso metti una barra rovesciata davanti allo spazio, così anche la shell remota lo legge come una sola parola.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Se il percorso dopo i due punti inizia senza barra né tilde, viene gestito rispetto alla cartella home dell'account remoto.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00Il manuale ufficiale dice di usare -O quando un vecchio server SFTP non riesce a convertire nella cartella home un percorso che inizia con la tilde. In questo caso, scrivere il percorso rispetto alla home senza tilde, come sopra, salva comunque nello stesso punto.
🔢 FAQ & contenuti consigliati











ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.