มีวิธีดำเนินการ scp ขัดจังหวะของไฟล์ต่อหรือไม่


12

ฉันดาวน์โหลดไฟล์ขนาดใหญ่เป็นครั้งคราวผ่าน scp และมีโอกาสเล็กน้อยทุกครั้งที่การเชื่อมต่อลดลงและตัดการถ่ายโอนระหว่างทาง

มีวิธีดำเนินการต่อหรือไม่

คำตอบ:


9

คุณสามารถลองใช้ approch ต่อไปนี้แทนscpใช้ddเพื่อข้ามส่วนที่ดาวน์โหลดและผนวกส่วนที่เหลือเข้ากับไฟล์

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

การเพิ่มประสิทธิภาพที่เป็นไปได้: ทำงานกับบล็อกขนาดใหญ่ ปล่อยให้เรื่องนี้เป็นการบ้าน


ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่ฉันยอมรับคำตอบอย่างไม่แน่นอนเนื่องจากใช้ dd sound ซึ่งเป็นวิธีการแก้ปัญหาที่ยอดเยี่ยม
GJ

ฉันเพิ่งทดสอบมันทำงานได้อย่างสมบูรณ์ขอบคุณ!
Kossak

@ Kossak ดีใจที่ได้ยิน!
yrk

ddด้วยบล็อคขนาดเล็กอาจช้า (เพียง 350 kB / s ที่นี่) โชคดีที่การscpถ่ายโอนดูเหมือนว่าจะมีขนาด 1024 ไบต์ ถ้าเป็นเช่นนั้นสำหรับไฟล์ของคุณ (หรืออื่น ๆ โดยการตัดทอนมันจะใกล้เคียงที่สุด 1024 ไบต์บล็อก) ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfileคุณสามารถเพิ่มความเร็วขึ้นเช่นนี้ (หมายเหตุว่า$sofarแล้วจะต้องมีจำนวน 1024 บล็อกไบต์เพื่อข้าม!)
tanius

2
มันเอาฉันบางเวลาที่จะตระหนักว่าในบรรทัดที่สองเป็นเพียงชื่อโฮสต์ตัวอย่างไม่ได้เป็นบางอาร์กิวเมนต์พิเศษrsys sshฉันขอแนะนำให้คุณแทนที่ด้วยuser@hostเพื่อหลีกเลี่ยงความสับสน
Ahmed Essam

7

ด้วยscp, ไม่มี

หากปลายทั้งสองข้างมีอยู่คุณสามารถใช้rsync -LvzP remoteserver:path/to/file localfileเพื่อถ่ายโอนไฟล์เดียว


สิ่งนี้ช่วยให้ฉันประหยัดเวลาในการดาวน์โหลดไฟล์ขนาดใหญ่ซึ่งถูกขัดจังหวะ ขอบคุณ.
phette23

3

ใช่มีวิธีการดำเนินการต่อจากจุดที่หยุดชะงัก แต่ไม่สามารถใช้ scp ได้ sftp reget filenameทำในสิ่งที่คุณต้องการ Yarek และ Grawity ได้ให้บริการโซลูชั่นที่ถูกต้องที่ฉัน +1 ทั้งคู่ แต่สำหรับการกลับมาทำงานต่อจากจุดขัดจังหวะฉันชอบ rsync ตัวอย่างคำสั่งที่ให้ทั้งคู่ถือว่าคุณกำลังเรียกไฟล์จากรีโมตเซิร์ฟเวอร์ไปยังเวิร์กสเตชันท้องถิ่นของคุณ (กำลังดาวน์โหลด) โปรดทราบว่าสองพารามิเตอร์สุดท้ายควรได้รับการพิจารณาว่าเป็น source_file และ target_file ตามลำดับ ไวยากรณ์ของชื่อไฟล์จะแตกต่างกันไปขึ้นอยู่กับว่าไฟล์ต้นทางหรือไฟล์เป้าหมายนั้นเป็นโลคัลหรือรีโมต หากฉันกำลังส่ง (อัปโหลด) [ข้อความ] ไฟล์ฉันจะเขียนตัวอย่างที่ให้ไว้เป็น:

# จากโลคัลเป็นรีโมต
sofar = `ssh remote_system ls -l interrupted_file | awk '{พิมพ์ $ 5}' ';
dd if = source_file bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

และเพื่อแก้ปัญหา rsync -e sshผมเพิ่ม คุณควรพิจารณาว่าจำเป็นต้องใช้คำฟุ่มเฟื่อยการบีบอัดสงวนสิทธิ์สิทธิ์ประทับเวลาไดเรกทอรีเรียกคืนหรือไม่ตรวจสอบหน้า man และ google เกี่ยวกับพารามิเตอร์ -L คุณอาจต้องการให้ symlink คงเป็นลิงก์แทนการอ้างอิง

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


1

มีทางออกอื่น (นอกเหนือจากเป็นrsyncหรือddการแก้ปัญหาที่ระบุไว้ที่นี่) ซึ่งฉันไม่มีใครแปลกใจที่กล่าวถึง: มันเป็นคำสั่งของreputsftp


0
scp -o ConnectTimeout 60

ให้คุณระบุการหมดเวลาสำหรับการเชื่อมต่อ อาจทำให้การเชื่อมต่อของคุณเลิกกัน


0

ใช่ถ้าทั้งสองฝ่ายสนับสนุน sftp - หลังจากความscp remoteuser@remotehost:/absolute/filename .ล้มเหลวคุณสามารถดำเนินการต่อโดยทำsftp remoteuser@remotehostแล้วreget /absolute/filenameเริ่มดาวน์โหลดต่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.