Bagaimana saya bisa menyalin banyak file melalui scp dalam satu perintah?

20

Saya harus memindahkan banyak file dari satu PC ke PC lainnya (keduanya Linux). Saya ingin menggunakan scpuntuk itu, tetapi scphanya memungkinkan untuk mentransfer satu file sekaligus.

Bagaimana saya bisa melakukan ini?

saya sudah

  • Tidak ada kemungkinan untuk menggunakan rsync atau protokol lainnya
  • Tidak ada kemungkinan untuk menggunakan sertifikat bebas frasa sandi (tetapi memiliki sertifikat dengan frasa sandi)
  • Daftar file yang akan ditransfer dan daftar dengan jalur tujuan file di server lain
  • File-file tersebar di banyak direktori, dan tidak semua file dalam direktori yang ingin saya salin

Jika memungkinkan, saya ingin gzip dan ungzip secara transparan untuk menghemat bandwidth!

Apakah ini mungkin?

Peter Smit
sumber

Jawaban:

31

Gunakan tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
akira
sumber
2
Inilah format file: "Dalam mode c, tar akan membaca nama yang akan diarsipkan dari nama file. Nama khusus -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

Saya ingin menggunakan scp untuk itu, tetapi scp hanya memungkinkan untuk mentransfer satu file sekaligus.

Saya cukup yakin itu tidak benar, paling tidak untuk scpperintah yang diberikan oleh OpenSSH yang disertakan dengan sebagian besar distribusi Linux.

Saya scp file1 file2 ... fileN user@host:/destination/directory/cukup sering menggunakan .

Untuk kompresi transparan, protokol SSH memiliki bawaan dan scpdapat menggunakannya jika Anda memberikan -Copsi pada baris perintah. Untuk banyak file kecil yang serupa, Anda akan menemukan opsi tar + gz yang disarankan oleh akira mendapatkan kompresi yang lebih baik karena dapat menggunakan kesamaan antara file-file tersebut di mana scpkompres setiap file sebagai entitas yang terpisah. Saya biasanya lebih suka menggunakan scp karena lebih mudah untuk melanjutkan transfer parsial (atau, meskipun saya tahu dalam situasi ini si penanya tidak memiliki opsi) rsynckarena keduanya lebih mudah untuk melanjutkan dan membagikan seluruh opsi tar + gz option Keuntungan kompresi -stream.

David Spillett
sumber
Ini adalah jawaban yang benar, tetapi hanya mentransfer satu file pada satu waktu. Namun demikian itu akan membuat penggunaan penuh bandwidth yang tersedia dan harus berjalan secepat mungkin.
Benjamin Bannier
4

Tidak scp -r yourdir otherhost:/otherdirbekerja

Coba ini:

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

yang z-flag untuk tar tidak kompresi. Atau Anda dapat menggunakan -C untuk ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
Jimmy Hedman
sumber
apa yang -Charus dilakukan
Nathan Fellman
1
Masalahnya adalah, saya punya daftar file. File-file tersebar di banyak direktori, dan tidak semua file dalam direktori yang ingin saya salin
Peter Smit
2
@Nathan: -C adalah untuk lett ssh melakukan kompresi.
Jimmy Hedman
1

Di RHEL5, berikut adalah satu-satunya cara yang mungkin saya tahu untuk mengamankan menyalin daftar file yang berisi karakter khusus (seperti spasi). Buat skrip shell dan sertakan yang berikut:

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

Itu bisa dilakukan tanpa banyak masalah.

Saya cukup membuat daftar file dengan nama host di sebelah setiap file dan scp tampaknya menguraikannya dengan baik. yaitu.

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

Scp tampaknya berfungsi dengan baik dengan sintaks ini. Ketika saya mencobanya tanpa nama host di sebelah setiap file gagal setelah file pertama. Saya sepertinya mengingat sintaks lain yang saya gunakan untuk ini sebelumnya dan akan mempostingnya setelah saya menemukannya.

Ernie M.
sumber
Ini berfungsi, tetapi cukup lambat - tampaknya memulai koneksi untuk setiap file ... (Saya datang ke sini mencari solusi untuk salinan lambat ...) ~/kebanyakan dapat ditinggalkan - SCP beroperasi relatif ke direktori home. .. Jika Anda memiliki daftar dari tempat lain di $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Ini akan merusak nama file dengan spasi)
Gert van den Berg