Apakah ada cara untuk melanjutkan scp file yang terputus?

11

Saya sesekali mengunduh file yang sangat besar melalui scp dan ada kemungkinan kecil setiap kali koneksi terjatuh dan memotong transfer di tengah jalan.

Apakah ada cara untuk melanjutkannya?

GJ.
sumber

Jawaban:

9

Anda dapat mencoba pendekatan berikut: alih-alih scp gunakan dd untuk melewati bagian yang diunduh dan menambahkan sisanya ke file.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Kemungkinan pengoptimalan: bekerja dengan blok besar. Mari kita tinggalkan ini sebagai pekerjaan rumah.

yrk
sumber
Saya belum menguji ini, tetapi saya menerima jawaban sementara karena menggunakan dd terdengar seperti pendekatan yang bagus untuk solusi.
GJ.
Saya baru saja mengujinya, bekerja dengan sempurna, terima kasih!
Kossak
@ Kosak, senang mendengar!
yrk
dddengan blocksize kecil bisa lambat (hanya 350 kB / dtk di sini). Untungnya, scptransfer tampaknya datang dalam blok 1024 byte. Jika jadi untuk file Anda (atau yang lain, oleh truncating ke terdekat 1024 blok byte), Anda dapat mempercepat itu seperti ini: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Perhatikan bahwa $sofarjumlah blok yang harus dilewati adalah 1024 byte!)
tanius
2
Butuh beberapa waktu untuk menyadari bahwa rsysdi baris kedua hanyalah contoh nama host, bukan argumen khusus untuk ssh. Saya sarankan Anda menggantinya dengan user@hostuntuk menghindari kebingungan.
Ahmed Essam
7

Dengan scp, tidak.

Jika kedua ujungnya memilikinya, Anda dapat menggunakannya rsync -LvzP remoteserver:path/to/file localfileuntuk mentransfer satu file.

pengguna1686
sumber
Ini menyelamatkan saya berjam-jam mengunduh file besar yang terputus. Terima kasih.
phette23
3

Ya, ada beberapa cara untuk melanjutkan dari titik interupsi, tetapi tidak mungkin menggunakan scp. sftp reget filenamelakukan apa yang kamu butuhkan. Yarek dan Grawity telah memberikan solusi valid yang saya beri +1 untuk keduanya, tetapi untuk melanjutkan dari titik interupsi, saya suka rsync. Contoh perintah yang diberikan keduanya menganggap Anda mengambil file dari server jauh ke workstation lokal Anda (mengunduh). Harap diingat bahwa dua parameter terakhir harus dianggap source_file dan target_file dalam urutan itu. Sintaks nama file bervariasi berdasarkan pada apakah sumber atau file target lokal atau jauh. Jika saya mengirim (mengunggah) file [teks], saya akan menulis ulang contoh yang diberikan sebagai:

#Dari lokal ke jarak jauh
sofar = `ssh remote_system ls-l interrupted_file | awk '{print $ 5}' `;
dd if = source_file bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

Dan untuk solusi rsync, saya tambahkan -e ssh. Anda harus mempertimbangkan apakah Anda perlu verbositas, kompresi, mempertahankan kepemilikan, izin, stempel waktu, direktori perulangan, dll. Periksa halaman manual dan google, mengenai parameter -L. Anda mungkin ingin symlink tetap sebagai tautan alih-alih merujuknya.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Daniel Liston
sumber
1

Ada solusi lain (selain rsyncatau ddsolusi yang dinyatakan di sini) yang saya terkejut tidak ada yang disebutkan: itu adalah reputperintah sftp.

knocte
sumber
0
scp -o ConnectTimeout 60

Memungkinkan Anda menentukan batas waktu koneksi. Dapat menjaga koneksi Anda dari putus.

pengguna1055604
sumber
0

Ya, jika kedua ujungnya mendukung sftp - setelah scp remoteuser@remotehost:/absolute/filename .gagal Anda dapat melanjutkan dengan melakukan sftp remoteuser@remotehostdan kemudian reget /absolute/filenamemelanjutkan pengunduhan.

jason drane
sumber