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


17

ฉันถ่ายโอนไฟล์และโฟลเดอร์หลายครั้งซ้ำ ๆscpโดยใช้คำสั่ง:

scp -rp /source/folder myremoteusername@122.10.12.123:/destination/folder

หลังจากการถ่ายโอนเสร็จสิ้นฉันต้องตรวจสอบว่าไฟล์ทั้งหมดถูกถ่ายโอนโดยไม่มีความเสียหายหรือscpดูแล (เช่นแสดงข้อความข้อผิดพลาดหากไฟล์ใดไม่ถูกถ่ายโอนอย่างถูกต้อง)?


หากคุณไม่ได้รับสถานะการออกที่ไม่เป็นศูนย์จากscpและข้อความแสดงข้อผิดพลาดที่แนบมากับstderrจะมีการคัดลอกทุกอย่างถูกต้องและครบถ้วน
roaima

tl; dr เล็กน้อยไปยังโพสต์ของฉัน: ใช้rsyncถ้าทำได้ มันจะคัดลอกการตรวจสอบสำหรับทุกไฟล์หลังจากการทำธุรกรรมเสร็จสิ้นดังนั้นจึงเป็นความคิดที่ดีที่จะใช้วิธีนี้เพื่อให้ปลอดภัยยิ่งขึ้น
polemon

คำตอบ:


24

scpตรวจสอบว่าได้คัดลอกข้อมูลทั้งหมดที่ส่งโดยบุคคลอื่น ความสมบูรณ์ของการถ่ายโอนนั้นรับประกันโดยโปรโตคอลช่องสัญญาณเข้ารหัส ดังนั้นคุณไม่จำเป็นต้องตรวจสอบความถูกต้องหลังจากโอน นั่นจะซ้ำซ้อนและไม่น่าเป็นไปได้มากที่จะเกิดข้อผิดพลาดของฮาร์ดแวร์เนื่องจากข้อมูลที่คุณเปรียบเทียบอาจจะอ่านจากแคช การตรวจสอบข้อมูลเป็นระยะจะมีประโยชน์ แต่การตรวจสอบทันทีหลังจากการถ่ายโอนไม่มีจุดหมาย

อย่างไรก็ตามคุณต้องแน่ใจscpว่าไม่ได้บอกคุณว่ามีบางอย่างผิดปกติ ควรมีข้อความแสดงข้อผิดพลาด แต่ตัวบ่งชี้ที่น่าเชื่อถือคือการscpส่งคืนรหัสออกที่ไม่ใช่ศูนย์หากมีบางอย่างผิดพลาด

แม่นยำยิ่งขึ้นคุณรู้ว่าไฟล์ถูกส่งอย่างถูกต้องหากscpส่งคืน 0 (เช่นรหัสสถานะสำเร็จ) ตรวจสอบว่าสถานะการออกเป็น 0จำเป็นเมื่อคุณเรียกใช้คำสั่งใด ๆ หากscpส่งคืนสถานะข้อผิดพลาดหรือหากสัญญาณถูกฆ่าหรือไม่เคยตายเพราะระบบขัดข้องหรือสูญเสียพลังงานในขณะที่กำลังทำงานอยู่คุณจะไม่รับประกัน โดยเฉพาะอย่างยิ่งเนื่องจากscpคัดลอกไฟล์ไปยังชื่อสุดท้ายโดยตรงซึ่งหมายความว่าคุณสามารถจบด้วยไฟล์บางส่วนในกรณีที่ระบบขัดข้อง ส่วนที่ถูกคัดลอกรับประกันว่าถูกต้อง แต่ไฟล์อาจถูกตัดทอน

เพื่อความน่าเชื่อถือที่ดีขึ้นให้ใช้ rsync แทน scp rsync จะเขียนลงในไฟล์ชั่วคราวและย้ายไปไว้ที่ตำแหน่งนั้นเมื่อเสร็จแล้ว ดังนั้นหาก rsync ส่งคืนรหัสความสำเร็จคุณจะรู้ว่าไฟล์นั้นมีอยู่และสำเนาที่ถูกต้องและสมบูรณ์ หาก rsync ไม่ได้ส่งคืนรหัสข้อผิดพลาดจะไม่มีไฟล์ปรากฏขึ้น (เว้นแต่จะมีไฟล์รุ่นเก่ากว่าซึ่งในกรณีที่เวอร์ชันเก่าจะไม่ถูกแก้ไข)


3

ฉันไม่เคยมีปัญหากับการทุจริตหลังจากที่ฉันทำscpอะไรบางอย่าง แต่ถ้าคุณกังวลเกี่ยวกับเรื่องนี้คุณสามารถทำงานmd5sum <filename>บนทั้งสองระบบเพื่อให้แน่ใจว่าพวกเขากำลังเหมือนกัน


3

ตามคำแนะนำของ @david-king นี่เป็นmd5โซลูชันพื้นฐานสำหรับการตรวจสอบความสมบูรณ์ของไฟล์หลังจากการถ่ายโอน เรียกใช้คำสั่งต่อไปนี้ครั้งหลังจากcdไอเอ็นจีที่จะ/source/folderอยู่บนเครื่องและเมื่อหลังจากที่cdไอเอ็นจีไปในพื้นที่ห่างไกล:/destination/folder find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sumแฮชที่ได้ควรเหมือนกันหลังจากการถ่ายโอนสำเร็จ

ปรับปรุง: ตามคำตอบนี้จะเป็นคำถามที่คล้ายกันในServerFault , scpไม่รับประกันความสมบูรณ์ของไฟล์(โปรดตรวจสอบคำตอบนี้โดย @Gilles สำหรับรายละเอียด) คุณสามารถใช้rsyncเพื่อถ่ายโอนไฟล์และตรวจสอบรหัสส่งคืนได้

อัปเดต 2:รายการต่อไปนี้จะตรวจสอบว่าไฟล์และขนาดที่เกี่ยวข้องตรงกันหรือไม่หลังจากการถ่ายโอน:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum


2
หาก scp คืนค่า 0 จะรับประกันความสมบูรณ์ นอกจากนี้หาก scp ไม่ส่งคืน 0 แสดงว่าปัญหาไม่ใช่ความเสียหายทั่วไป แต่เป็นการตัดทอนเฉพาะ การยืนยันขนาดไฟล์นั้นเพียงพอ (ยกเว้นในกรณีที่มีไฟล์เป้าหมายรุ่นเก่ากว่าอยู่แล้ว: หาก scp ถูกขัดจังหวะตั้งแต่เนิ่นๆจะมีเวอร์ชันเก่ากว่า) การตรวจสอบ checksums ที่นี่เป็นการเสียเวลา
Gilles 'หยุดความชั่วร้าย'

ธรรม ฉันปรับปรุงคำตอบของฉัน
มณีม

คุณไม่ได้แก้ไขข้อบกพร่องพื้นฐาน การตรวจสอบscpรหัสส่งคืนเพียงพอและการตรวจสอบแฮชไม่มีประโยชน์
Gilles 'หยุดความชั่วร้าย'

1
แม้ว่าscpผลตอบแทน 0 ก็ไม่ได้รับประกันว่าระบบไฟล์ไม่ได้ messed สิ่งขึ้นดังนั้นการตรวจสอบแฮชยังคงเป็นประโยชน์สำหรับการตรวจสอบความสมบูรณ์ของข้อมูลที่สำคัญถ้ามีคนเลือกที่จะใช้มากกว่าscp rsync
มณี M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.