Bir dosyanın kesilmiş bir scp sürdürmek için bir yolu var mı?


12

Bazen scp aracılığıyla çok büyük bir dosya indiriyorum ve bağlantı her seferinde bağlantıyı kesip aktarmayı yarıda kesmenin küçük bir şansı var.

Devam ettirmenin bir yolu var mı?

Yanıtlar:


9

Aşağıdaki yargıyı deneyebilirsiniz: yerine scp kullanımı dd indirilen kısmını atlamak ve dosyaya kalanını eklemek için.

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

Olası optimizasyon: büyük bloklarla çalışın. Bunu bir ödev olarak bırakalım.


Bunu henüz test etmedim, ancak dd seslerini çözüm için harika bir yaklaşım gibi kullandığım için cevabı geçici olarak kabul ediyorum.
GJ.

Sadece test ettim, mükemmel çalışıyor, teşekkürler!
Kossak

@Kossak, duyduğuma sevindim!
yrk

ddküçük blok boyutları yavaş olabilir (burada sadece 350 kB / s). Neyse ki, scptransferler 1024 baytlık bloklar halinde geliyor gibi görünüyor. Dosyanızın böylece (veya başka, en yakın 1024 bayt bloğuna bunu kesiliyor tarafından), bunu şöyle hızlandırabilir ise: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (O $sofarzaman atlamak için 1024 baytlık blok sayısı olmalı!)
tanius

2
rsysİkinci satırda sadece özel bir argüman olmayan örnek bir hostname olduğunu fark etmem biraz zaman aldı ssh. user@hostKarışıklığı önlemek için yerine koymanızı öneririm .
Ahmed Essam

7

İle scp, hayır.

Her iki uçta da varsa, rsync -LvzP remoteserver:path/to/file localfiletek bir dosyayı aktarmak için kullanabilirsiniz .


Bu, kesintiye uğrayan büyük bir dosyayı indirmeme saatler kazandırdı. Teşekkür ederim.
phette23

3

Evet, kesinti noktasından devam etmenin yolları vardır, ancak scp kullanarak mümkün değildir. sftp reget filenameihtiyacınız olanı yapar. Yarek ve Grawity, her ikisine de + 1'lediğim geçerli çözümler sağladı, ancak bir kesinti noktasından devam etmek için rsync'i seviyorum. Verilen örnek komutların her ikisi de, uzak sunucudan yerel iş istasyonunuza (indirme) bir dosya aldığınız varsayılmaktadır. Lütfen son iki parametrenin kaynak_dosyası ve hedef_dosyası olarak bu sırayla değerlendirilmesi gerektiğini unutmayın. Dosya adının sözdizimi, kaynak veya hedef dosyanın yerel veya uzak olmasına bağlı olarak değişir. [Metin] dosyaları gönderip (karşıya yüklüyordum), sağlanan örnekleri şöyle yeniden yazardım:

# Yerelden uzaktan kumandaya
sofar = `ssh uzak_sistem ls -l interrupted_file | awk '{print $ 5}' ';
gg if = kaynak_dosyası bs = 1 atlama = $ sofar | ssh remote_system "cat >> ./interrupted_file"

Ve rsync çözümüne ekliyorum -e ssh. -L parametresi ile ilgili ayrıntı ayrıntılarına, sıkıştırmaya, sahipliğin korunmasına, izinlere, zaman damgasına, recurse dizinlerine vb. İhtiyacınız olup olmadığını göz önünde bulundurmalısınız. Sembolik bağlantılara başvurmak yerine bağlantı olarak kalmasını isteyebilirsiniz.

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


1

(Yanı sıra başka bir çözüm var rsyncya ddçözümleri burada belirtilen) Sürpriz kimse söz değilim: bu kadar reputkomuta sftp.


0
scp -o ConnectTimeout 60

Bir bağlantı için zaman aşımını belirtmenize izin verir. Bağlantınızın kesilmesini engelleyebilir.


0

Evet, eğer her iki uç da sftp'yi destekliyorsa - scp remoteuser@remotehost:/absolute/filename .başarısız olduktan sonra , devam ettirerek sftp remoteuser@remotehostve ardından reget /absolute/filenameindirmeye devam edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.