วิธีดำเนินการต่อ scp ด้วยไฟล์ที่คัดลอกบางส่วน [ปิด]


109

ฉันใช้คำสั่ง scp shell เพื่อคัดลอกโฟลเดอร์ไฟล์ขนาดใหญ่

แต่ในบางครั้งฉันต้องฆ่าคำสั่งที่กำลังทำงานอยู่ (โดย Ctrl + C หรือ kill)

เพื่อความเข้าใจของฉัน scp คัดลอกไฟล์ตามลำดับดังนั้นควรมีไฟล์ที่คัดลอกเพียงบางส่วนเท่านั้น

คำสั่ง scp เดียวกันจะกลับมาทำงานต่อได้อย่างไรเพื่อไม่ให้เขียนทับไฟล์ที่คัดลอกสำเร็จและจัดการไฟล์ที่คัดลอกบางส่วนอย่างถูกต้อง

ปล. ฉันรู้ว่าฉันสามารถทำสิ่งประเภทนี้ใน rsync ได้ แต่ scp นั้นเร็วกว่าสำหรับฉันด้วยเหตุผลบางประการและฉันใช้มันแทน


4
ฉันสงสัยว่า rsync ช้ากว่าเพราะใช้เวลามากขึ้นในการทำสิ่งต่างๆที่อนุญาตให้คุณเริ่มการถ่ายโอนใหม่ คุณอาจลองใช้ rsync เพื่อสิ้นสุดการถ่ายโอนบางส่วน
Keith Thompson

2
ถ้าคุณอยากฉลาดคุณสามารถลองddใช้skipตัวแปรที่เหมาะสมได้ตลอดเวลาและไปที่ssh:)
Mark Nunberg

1
นี่ไม่ใช่หัวข้อสำหรับ SO มันเป็นของ SuperUser และถูกถามที่นั่นอย่างแน่นอน
Dan Dascalescu

rsync ใช้ ssh โดยค่าเริ่มต้นภายใต้ฝาครอบTypically, rsync is configured to use ssh by defaultดังนั้น ... มันควรจะเร็วที่สุด (แม้ว่ามันจะแสดงรายการไดเรกทอรีก่อนซึ่งอาจทำให้การเริ่มต้นช้าลง)
rogerdpack

คำตอบ:


198

คุณควรใช้rsyncมากกว่าssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

ตัวเลือกที่สำคัญคือ-Pซึ่งเหมือนกับ--partial --progress

ตามค่าเริ่มต้น rsync จะลบไฟล์ที่ถ่ายโอนบางส่วนหากการถ่ายโอนถูกขัดจังหวะ ในบางสถานการณ์ควรเก็บไฟล์ที่ถ่ายโอนบางส่วนไว้ การใช้ตัวเลือก --partial บอกให้ rsync เก็บไฟล์บางส่วนไว้ซึ่งจะทำให้การถ่ายโอนไฟล์ที่เหลือในภายหลังเร็วขึ้นมาก

นอกจากนี้ยังสามารถใช้ตัวเลือกอื่น ๆ เช่น-a(สำหรับโหมดเก็บถาวร) และ-z(เพื่อเปิดใช้งานการบีบอัด)

คู่มือ: https://download.samba.org/pub/rsync/rsync.html


50
เพียงแค่ต้องการทราบว่า rsync จะดำเนินการต่อสำเนาแบตช์ที่เริ่มต้นด้วย scp ได้ดี
Craig Anderson

9
คุณจะได้รับ "ข้ามไดเรกทอรี" ข้อผิดพลาดเว้นแต่คุณจะระบุ-rด้วย ที่มา: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka

4
ทำงานให้ฉัน แต่ฉันเพิ่ม --append ด้วย .... rsync -P - append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd

1
@CraigAnderson นั่นคือจุดสำคัญที่ถูกทิ้งเอาไว้ คำตอบดูเหมือนจะแนะนำให้ดาวน์โหลดควรเริ่มต้นด้วย rsync เพื่อเริ่มต้นด้วย
Willa

1
ตัวเลือกที่ให้ไว้ในคำตอบไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
กระต่ายกระต่าย

29

ทางเลือกสำหรับ rsync:

ใช้sftpกับตัวเลือก-r(ซ้ำคัดลอกไดเรกทอรีทั้งหมด) และตัวเลือก-aของsftp's get'คำสั่งดำเนินการต่อการโอนบางส่วนของไฟล์ที่มีอยู่.'

วิชาบังคับก่อน:คุณsftpดำเนินการมีอยู่แล้วgetกับ-aตัวเลือก

ตัวอย่าง:

คัดลอกไดเร็กทอรี/foo/barจากเซิร์ฟเวอร์ระยะไกลไปยังไดเร็กทอรีปัจจุบันของคุณ ไดเร็กทอรีbarจะถูกสร้างขึ้นในไดเร็กทอรีปัจจุบันของคุณ

echo "get -a /foo/bar" | sftp -r user@remote_server

5
โซลูชันของคุณดีมากเพราะเซิร์ฟเวอร์ของฉันไม่อนุญาตให้เข้าสู่ระบบใน ssh ดังนั้น rsync จึงไม่ทำงาน ฉันต้องการอัปโหลดแทนที่จะดาวน์โหลดดังนั้นนี่คือคำสั่งของฉัน:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez

2
ดูเหมือนว่าเป็นตัวเลือกที่ใช้งานได้มากสำหรับการเรียกคืนไฟล์ที่ดาวน์โหลดมาบางส่วนเนื่องจาก rsync ดูเหมือนจะไม่เป็นมิตรกับ ssh มากนัก (ด้วยพอร์ตที่ไม่ใช่ค่าเริ่มต้น)
codezombie

13

ตั้งแต่ OpenSSH 6.3 คุณสามารถใช้regetคำสั่งในรูปแบบsftp.

มีไวยากรณ์เดียวกันกับgetยกเว้นว่าจะเริ่มการถ่ายโอนจากจุดสิ้นสุดของไฟล์ในเครื่องที่มีอยู่

echo "reget /file/path" | sftp -r user@server_name

ผลเดียวกันมี-aสลับไปที่getคำสั่งหรือบรรทัดคำสั่งทั่วโลก-aสวิทช์ของ `SFTP


6

ความเป็นไปได้อีกอย่างหนึ่งคือการพยายามกอบกู้ scp ที่คุณเริ่มต้นไปแล้วเมื่อมันหยุดนิ่ง

ctrl + z เป็นพื้นหลังและหยุดจากนั้น ssh ไปที่เซิร์ฟเวอร์รับและเข้าสู่ระบบจากนั้นออก ตอนนี้ fg กระบวนการ scp และดูการดำเนินการต่อจาก 'จนตรอก'!


ทำงานให้ฉันบน Mac OS X ขอบคุณที่โพสต์สิ่งนี้วันนี้ช่วยประหยัดเบคอนของฉัน!
Ben Hitchcock

เตะเครือข่ายนั้นเพื่อดูว่ามันฟื้นขึ้นมาเองหรือไม่ :)
rogerdpack

2

เมื่อ rsync หยุดทำงานเช่นกันหลังจากผ่านไปสองสามวินาทีเมื่อเริ่มทำงานได้ดีฉันลงเอยด้วยโซลูชันกำลังดุร้ายต่อไปนี้เพื่อเริ่มและหยุดการเริ่มการดาวน์โหลดใหม่ทุกๆ 60 วินาที

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done

1

คุณสามารถใช้ประโยชน์จาก-rshและ-Pตัวเลือกของrsync. -Pมีไว้สำหรับการดาวน์โหลดบางส่วนและ-rshระบุว่าการโอนผ่าน ssh procotol

คำสั่งที่สมบูรณ์จะเป็น: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path


เหมือนกับคำตอบของ jordi หรือไม่?
rogerdpack

-4

ฉันได้รับปัญหาเดียวกันเมื่อวานนี้โดยถ่ายโอนไฟล์ sql ขนาดใหญ่ผ่าน scp ฉันโชคดีด้วย wget --continue the_url

โพสต์บล็อกนั้นอธิบายได้ค่อนข้างดี http://www.cyberciti.biz/tips/wget-resume-broken-download.htmlโดยพื้นฐาน:

wget --continue url

ถือเป็นแนวทางปฏิบัติที่ดีที่สุดในการคัดลอกส่วนที่เกี่ยวข้องจาก url ไปยังคำตอบในกรณีที่ไซต์หยุดทำงาน
Ryre

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