Esempi comuni
| Operazione | Comando |
|---|---|
| Caricare un file | scp report.pdf user@server:/tmp/ |
| Scaricare un file | scp user@server:/tmp/report.pdf . |
| Scaricare con un nuovo nome | scp user@server:/tmp/report.pdf copy.pdf |
| Caricare una cartella | scp -r site user@server:/tmp/ |
| Scaricare il contenuto di una cartella | scp -r 'user@server:/tmp/site/*' dl/ |
| Un'altra porta | scp -P 2222 file user@server:/tmp/ |
| Usare una chiave specifica | scp -i ~/.ssh/id_work file user@server:/tmp/ |
| Mantenere date e permessi | scp -p file user@server:/tmp/ |
| Limitare la velocità, in Kbit/s | scp -l 800 file user@server:/tmp/ |
| Comprimere | scp -C file user@server:/tmp/ |
| Passando da un jump host | scp -J user@jump file user@server:/tmp/ |
Anche qui funziona una voce Host in ~/.ssh/config: scp file server:/tmp/. Vedi il file di configurazione SSH.
La riga con -J passa da un jump host. Per salvare quel percorso una volta per tutte, vedi ProxyJump e jump host.
Copiare una cartella due volte la annida
Se la cartella di destinazione esiste già, scp -r mette la cartella al suo interno. Con /tmp/site già presente sul server, questo comando ci ha dato /tmp/site/site:
scp -r site user@server:/tmp/site
Quindi la prima esecuzione crea /tmp/site e la seconda crea /tmp/site/site. Per copiare una cartella più volte, usa invece rsync.
Nomi con spazi
scp "my file.txt" "user@server:/tmp/my file.txt"
Funziona con il protocollo SFTP predefinito. Con il vecchio protocollo di -O, la stessa riga è fallita con scp: ambiguous target, perché il lato remoto rilegge il nome. In quel caso aggiungi una seconda coppia di apici:
scp -O "my file.txt" 'user@server:"/tmp/my file.txt"'
Tra due server
scp -3 user@one:/tmp/file user@two:/tmp/
-3 fa passare i dati dalla tua macchina, quindi nessuno dei due server ha bisogno di un login sull'altro. Da OpenSSH 8.7 è il comportamento predefinito, quindi l'opzione lo rende solo esplicito. Nella nostra prova, anche una copia senza -3 è passata dal client locale.
Per far collegare direttamente il primo server al secondo, usa -R:
scp -R user@one:/tmp/file user@two:/tmp/
Il primo server deve allora poter fare login sul secondo senza alcuna richiesta, e deve già conoscerne la chiave host. Altrimenti ottieni Host key verification failed., che è quello che è successo nella nostra prova.
-O: il protocollo legacy
Da OpenSSH 9.0, scp usa di default il protocollo SFTP. Lo vedi con scp -v, che stampa Sending subsystem: sftp. Con -O stampa Sending command: scp -v -t /tmp/.
scp -O file user@server:/tmp/
Ti serve -O quando l'altra parte non ha il sottosistema SFTP, come alcuni dispositivi embedded. In quel caso l'errore tipico è subsystem request failed on channel 0. Vedi la guida a quell'errore.
Cosa scp non fa
- Non riprende un trasferimento interrotto. Eseguilo di nuovo e ricomincia da capo.
- Non invia solo ciò che è cambiato.
Per questo usa rsync, oppure reget in sftp. Per un confronto completo, leggi scp, SFTP o rsync.
Domande
Come si copia una cartella con scp?
Aggiungi -r: scp -r cartella user@server:/tmp/. Se la cartella di destinazione esiste già, scp ci mette dentro la cartella.
Come si usa scp con un'altra porta?
Con -P maiuscola, per esempio scp -P 2222 file user@server:/tmp/. La -p minuscola invece conserva date e permessi dei file.
scp può riprendere un trasferimento interrotto?
No. Se lo rilanci, ricomincia il file da capo. Usa rsync con --partial, oppure reget e reput dentro sftp.