Comando scp: uso e opzioni, copiare cartelle e indicare la porta

Ambiente di testFamiglia RHELAlmaLinux 9.8OpenSSH 9.9p1Lato ricevente Debian 12 · OpenSSH 9.2p1account rootVerificato il 2026-10-28

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.

🧭 Direzione di copia di scp e percorsi remoti
Diagramma esplicativo
↔️ Direzione di copia
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
origine💻 Server che esegue il comandoreport.txt
➜
destinazione🖥️ Server remoto203.0.113.10:~/scp-test/
origine🖥️ Server remoto203.0.113.10:~/scp-test/report.txt
➜
destinazione💻 Server che esegue il comando./downloads/
origine🖥️ Server remoto A203.0.113.10:~/scp-test/report.txt
➜
Inoltro💻 Server che esegue il comando-3
➜
destinazione🖥️ Server remoto B198.51.100.20:~/scp-test/
🧩 Forma del percorso remoto
user l'account con cui ti connetti, 203.0.113.10 l'indirizzo del server o il dominio, :~/scp-test/ e dopo i due punti il percorso su quel server (la tilde indica la cartella home)
Con il file locale davanti e il percorso remoto dietro, stai inviando. Se il percorso dopo i due punti termina con una barra, il file viene salvato in quella cartella con lo stesso nome.
Con il percorso remoto davanti, stai ricevendo. Il file ricevuto resta nel percorso locale scritto dietro.
Quando origine e destinazione sono entrambe server remoti, da OpenSSH 8.7 i dati passano dal server che esegue il comando. È lo stesso metodo di quando si aggiunge -3.

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:00

Al 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:00

Se 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.txt
report.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.

Simulatore del comando scpOpenSSH 9.9
[root@server work]#
Funziona solo nel browser. Controlla i file del lato remoto nell'elenco a sinistra e richiama i comandi precedenti con ↑↓.

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.gz
backup.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.

ComandoFileTempo di esecuzioneVelocità dell'indicatore di avanzamento
scp backup.tar.gz20MB0,68 s53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82 s996.5KB/s
scp access.log (3 volte)19MB0.79~0.89 s—
scp -C access.log (3 volte)19MB0.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 seconds

La 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

OpzioneCompitoRisultato in questo articolo
-PIndica la porta di connessione SSHPorta 22: invio di report.txt completato; porta chiusa 2222: terminato con [Connection timed out]
-iIndica il file di chiave privata per l'autenticazione a chiave pubblicaInvio di report.txt completato indicando ~/.ssh/id_ed25519
-rCopia i file e le sottocartelle della cartellaSul lato ricevente restano le cartelle css e images con la struttura originale; senza l'opzione, l'errore [not a regular file] blocca il trasferimento
-pConserva l'orario di modifica, l'orario di accesso e i permessi dell'origineOrario di modifica conservato; sul lato ricevente di questo articolo, il permesso 600 è rimasto solo nel file inviato con -O -p
-CComprime i dati sulla connessione SSHCon il log da 19MB tra i due server di questo articolo, l'invio con l'opzione è stato un po' più lento
-lImposta il limite della velocità di trasferimento in Kbit/sCon -l 8000, 20MB a 996.5KB/s in 20.82 secondi
-vMostra il processo dalla connessione al trasferimento in righe debug1Trasferimento SFTP confermato dalla riga [Sending subsystem: sftp]
-3Trasferisce 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
-OTrasferisce con il vecchio protocollo SCPNell'output di -v compare [Sending command: scp -v -t]; i percorsi con spazi richiedono una barra rovesciata in più
-oPassa a ssh un'opzione in formato ssh_configAttesa impostata a 10 secondi con ConnectTimeout=10 e [Connection timed out] confermato

📎 Altre opzioni: secondo il manuale ufficiale

OpzioneCompito
-qDisattiva l'indicatore di avanzamento e gli avvisi e i messaggi diagnostici di ssh
-JSi 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)
-FIndica un altro file come file di configurazione utente di ssh (passato direttamente a ssh)
-4Forza l'uso dei soli indirizzi IPv4
-6Forza 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:00

L'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.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh 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.txt

report-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:00

Senza -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_ed25519

Il 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.

Vocescprsync
Ambito del trasferimentoTutti i file indicati a ogni esecuzioneSolo i file modificati rispetto all'origine
Conservare i file ricevuti a metà (--partial)❌✅
Eliminare i file assenti nell'origine (--delete)❌✅
Link simboliciLi segue e copia i file originaliCon -a restano link
Necessario sul lato riceventeAccesso SSH e server SFTPrsync 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 directory

In 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 closed

Se 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:00

Aggiungendo -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 target

In 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:00

Se 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.txt
report.txt                                    100%   14     5.6KB/s   00:00

Il 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

Se esiste un file con lo stesso nome, viene sovrascritto dal nuovo senza chiedere conferma. Anche inviando più volte lo stesso report.txt nella stessa cartella, il trasferimento è avvenuto ogni volta senza domande. Per questo, i file da conservare inviali con un altro nome alla fine del percorso di destinazione.

Se metti * nel percorso remoto e lo racchiudi tra virgolette semplici, vengono ricevuti tutti i file del server remoto con il nome corrispondente. Ricevendo report-*.txt dal server remoto, i sei file corrispondenti sono stati trasferiti uno dopo l'altro. Le virgolette servono a evitare che la shell del server che esegue il comando interpreti * per prima.

Con -B, scp viene eseguito in modalità batch, che non chiede password né passphrase. Secondo il manuale ufficiale, in questa modalità non si può digitare la password, quindi per le attività automatiche come cron configura prima l'autenticazione a chiave.

🧭 Contenuti consigliati sui comandi di rete 13 articoli · 2 fonti
🗂️ Comandi di rete
📄 Comando ip 📄 Comandi netstat · ifconfig 📄 Comando nmtui
📄 Comando SSH 📄 Comando rsync 📄 Comando wget 📄 Comandi rz · sz 📄 Comando scp
📄 Comando host 📄 Comando nslookup
📄 Comando iptables 📄 Comando firewall-cmd 📄 Comando certbot

ℹ️ 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 3   +   2   =