Bagaimana saya bisa melanjutkan transfer file scp besar ketika menggunakan penerusan porta?

10

Saya punya mesin beberapa hop jauhnya, dan saya perlu mengatur port forwarding untuk mentransfer file.

Sunting: Agar jelas, beberapa hop diperlukan untuk mengakses mesin jarak jauh. Dari mesin saya, saya mengatur VPN, tempat saya dapat mengakses 10.255.xx - itu adalah satu-satunya mesin yang dapat saya sambungkan melalui VPN. Setelah masuk ke .xx, saya kemudian dapat terhubung ke komputer lain - .Yy menjadi salah satu dari mereka.

Dari mesin saya:

ssh -L 4567:localhost:4567 [email protected]

Kemudian dari mesin itu:

ssh -L 4567:localhost:22 [email protected]

Saya kemudian bisa

scp -P 4567 me@localhost:/path/to/large/file.gz .

Saya meninggalkan overnite berjalan ini, hanya untuk menemukan bahwa transfer mati di beberapa titik.

Saya telah melihat beberapa saran untuk menggunakan rsync di atas ssh untuk melanjutkan transfer, tetapi saya tidak jelas cara mengaturnya. Apakah ini mungkin?

chris
sumber
Untuk apa semua hop ini? Tidakkah scp [email protected]:/path/to/large/file.gz .mencapai hal yang persis sama? Versi scp (ssh) mana yang diinstal pada klien dan server?
Dennis
@ Dennis: scp tidak mendukung melanjutkan transfer - apa yang Anda sarankan akan memulai kembali unduhan.
chris
Beberapa versi melakukannya (scp laptop saya melakukannya, VPS saya tidak). Alasan saya bertanya adalah karena hop tampaknya tidak perlu bagi saya, dan melakukan sinkronisasi tanpa hop akan jauh lebih mudah.
Dennis
Jawaban ini mungkin membantu Anda juga: unix.stackexchange.com/a/43097/14084
Bernhard

Jawaban:

9

Dengan beberapa versi scp (versi di komputer sumber tampaknya menjadi kunci), hanya menjalankan kembali perintah scp akan cukup untuk melanjutkan transfer. Tetapi berhati-hatilah! Jika versi Anda tidak mendukung transfer parsial, sebagian file hanya akan ditimpa.

Switch rsync berikut berguna untuk melanjutkan transfer yang rusak jika scp tidak mendukungnya:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

Perintah

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

harus memiliki efek yang diinginkan. Perhatikan bahwa -psaklar harus huruf kecil untuk ssh.

Dennis
sumber
Hop diperlukan karena cara jaringan pada server tujuan dikonfigurasi. Masalah dengan menggunakan rsync over ssh adalah saya harus menggunakan port lokal 4567, file tidak ada di server 10.255.xx.
chris
Kesalahanku. Saya berasumsi itu 10.255.y.yadalah komputer klien.
Dennis
Saya telah memperbarui jawaban saya.
Dennis
dan apa yang harus dilakukan jika tidak ada cara menggunakan rsync? Dalam kasus saya, saya hanya memiliki ftp yang tersedia di host jarak jauh.
dr.dimitru
1
@ Enzo Pertanyaannya adalah tentang SCP, jawabannya harus tentang scp. Pertanyaannya adalah tentang transfer scp tidak lengkap, bukan tentang alat scp. Secara harfiah mengatakan saya telah melihat beberapa saran untuk menggunakan rsync di atas ssh untuk melanjutkan transfer, tapi saya tidak jelas bagaimana mengaturnya. Apakah ini mungkin? di dasar.
Dennis
2

Gunakan sftp bukan scp

Dalam kasus Anda:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

Dari halaman manual sftp:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.
AlexR
sumber
1

rsync menggunakan ssh secara default, Anda mungkin harus menentukan perintah ssh yang tepat menggunakan rsync's -e switch. Ini juga memiliki --partial yang harus menyimpan file yang tidak lengkap sehingga dapat melanjutkan transfer.

Luke Hollins
sumber
-1

Saya benar-benar tidak bisa melihat apa gunanya terowongan Anda, jadi inilah cara saya akan menyelesaikan masalah Anda:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

ini membuka terowongan terbalik dari mesin lokal (localhost) ke mesin jarak jauh (remotehost). $ tunnelPort adalah port tempat tunnel ditemukan di remotehost. $ localSSHPort adalah port tempat sshd lokal berjalan dan $ remoteSSHPort adalah tempat sshd remotehost mendengarkan.

Sekarang Anda berada di dalam terowongan (mundur!), Anda bisa melakukan apa yang Dennis sarankan:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

flag -a dan -z dijelaskan di halaman manual rsync, jadi saya tidak akan menguraikannya. Apa yang terjadi sekarang adalah ketika Anda menjalankan rsync pada remotehost seperti di atas, ia mendorong semua data ke port $ tunnelPort yang kemudian diteruskan ke sshd $ localSSHPort localhost Anda.

Harapan itu membantu.

berbakat
sumber
@ingenous: Saya menambahkan penjelasan untuk terowongan.
chris