Come posso copiare più file su SCP con un solo comando?


20

Devo trasportare molti file da un PC a un altro (entrambi Linux). Vorrei usarlo scpper questo, ma scpconsente solo di trasferire un file alla volta.

Come posso fare questo?

io ho

  • Nessuna possibilità di utilizzare rsync o qualsiasi altro protocollo
  • Nessuna possibilità di utilizzare certificati senza passphrase (ma avere un certificato con passphrase)
  • Un elenco di file da trasferire e un elenco con il percorso di destinazione dei file sull'altro server
  • I file sono distribuiti su molte directory e non tutti i file nelle directory che voglio copiare

Se possibile, vorrei decomprimere e decomprimere in modo trasparente per risparmiare larghezza di banda!

È possibile?

Risposte:


31

Utilizzare tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
Ecco il formato del file: "In modalità c, tar leggerà i nomi da archiviare dal nome file. Il nome speciale -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''."
Kousha

14

Vorrei usare scp per questo, ma scp consente solo di trasferire un file alla volta.

Sono abbastanza sicuro che non sia vero, almeno non per il scpcomando fornito da OpenSSH incluso nella maggior parte delle distribuzioni Linux.

Uso scp file1 file2 ... fileN user@host:/destination/directory/abbastanza frequentemente.

Per una compressione trasparente, il protocollo SSH ha questo integrato e scppuò usarlo se si fornisce l' -Copzione dalla riga di comando. Per molti piccoli file simili troverai che l'opzione tar + gz suggerita da Akira ottiene una migliore compressione in quanto può fare uso della somiglianza tra tali file dove scpcomprime ogni file come entità separata. In genere preferisco usare scp anche se è più facile riprendere un trasferimento parziale (o, anche se so in questa situazione, l'interrogante non ha l'opzione) in rsyncquanto è ancora più facile riprendere e condividere l'intera opzione tar + gz -stream vantaggio di compressione.


Questa è la risposta giusta, ma in realtà trasferisce solo un file alla volta. Tuttavia farà pieno uso della larghezza di banda disponibile e dovrebbe funzionare il più velocemente possibile.
Benjamin Bannier,

4

Non scp -r yourdir otherhost:/otherdirfunziona?

Prova quindi:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

il z-Flag a tar fa compressione. Oppure puoi usare -C per ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

ciò che -Cfare?
Nathan Fellman

1
Il problema è che ho un elenco di file. I file sono distribuiti su molte directory e non tutti i file nelle directory che voglio copiare
Peter Smit

2
@Nathan: -C è lasciare che ssh faccia la compressione.
Jimmy Hedman,

1

Su RHEL5, ecco l'unico modo possibile che conosco per proteggere una lista di file che contengono caratteri speciali (come uno spazio). Crea uno script di shell e includi quanto segue:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

Può essere fatto senza troppi problemi.

Creo semplicemente un elenco di file con il nome host accanto a ciascun file e scp sembra analizzarlo bene. vale a dire.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp sembra funzionare bene con questa sintassi. Come ho provato senza il nome host accanto a ciascun file, non è riuscito dopo il primo file. Mi sembra di ricordare un'altra sintassi che ho usato per questo prima e la posterò una volta trovata.


Funziona, ma è piuttosto lento - sembra avviare una connessione per ogni file ... (Sono venuto qui alla ricerca di una soluzione per la copia lenta ...) ~/può essere per lo più lasciato fuori - SCP funziona relativamente alla home directory. .. Se hai un elenco altrove in $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Questo si spezzerà per i nomi di file con spazi però)
Gert van den Berg

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.