SCP และบีบอัดในเวลาเดียวกันไม่มีการบันทึกระดับกลาง


63

วิธีที่บัญญัติไว้คือ:

  • scp ไฟล์ไปยังตำแหน่งระยะไกล
  • บีบอัดไฟล์ระหว่างทาง ( tarหรือไม่ไฟล์เดียวหรือทั้งโฟลเดอร์7zaหรืออย่างอื่นมีประสิทธิภาพยิ่งขึ้น)
  • ทำข้างต้นโดยไม่บันทึกไฟล์กลาง

ฉันคุ้นเคยกับเปลือกท่อเช่นนี้

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z

หลัก:

  • กลิ้งโฟลเดอร์ทั้งหมดเป็นโฟลเดอร์เดียว tar
  • ส่งผ่านข้อมูลstdoutไปยังstdinของโปรแกรมบีบอัด
  • ใช้การบีบอัดเชิงรุก

วิธีที่ดีที่สุดในการทำเช่นนี้คือการsshเชื่อมโยงกับไฟล์เชื่อมโยงไปถึงบนระบบไฟล์ระยะไกล?


ฉันไม่ชอบที่จะsshfsเมาน


สิ่งนี้ใช้ไม่ได้:

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z

เพราะ:

/dev/fd/63: not a regular file

คำตอบ:


102

มีหลายวิธีที่จะทำสิ่งที่คุณต้องการ วิธีที่ง่ายที่สุดคือใช้pìpe:

tar zcvf -  MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"

ที่นี่การบีบอัดจะถูกจัดการโดยการtarโทรgzip( zแฟล็ก) คุณสามารถใช้compress( Z) และbzip( j) สำหรับ7zทำสิ่งนี้:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | 
   ssh user@server "cat > /path/to/backup/foo.7z"

ที่ดีที่สุดวิธี rsyncแต่น่าจะเป็น

   Rsync is a fast and extraordinarily versatile  file  copying  tool.   It  can  copy
   locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
   mon.  It offers a large number of options that control every aspect of its behavior
   and  permit  very  flexible  specification of the set of files to be copied.  It is
   famous for its delta-transfer algorithm, which reduces the amount of data sent over
   the network by sending only the differences between the source files and the exist‐
   ing files in the destination.  Rsync is widely used for backups and  mirroring  and
   as an improved copy command for everyday use.

rsyncมีวิธีที่ตัวเลือกมากเกินไป มันคุ้มค่าที่จะอ่านผ่านพวกเขา แต่พวกเขาน่ากลัวตั้งแต่แรกเห็น สิ่งที่คุณใส่ใจในบริบทนี้คือ:

    -z, --compress              compress file data during the transfer
        --compress-level=NUM    explicitly set compression level

   -z, --compress
          With this option, rsync compresses the file data as it is sent to the desti‐
          nation machine, which reduces the amount of data being transmitted --  
          something that is useful over a slow connection.

          Note  that this option typically achieves better compression ratios than can
          be achieved by using a compressing remote shell or a  compressing  transport
          because  it takes advantage of the implicit information in the matching data
          blocks that are not explicitly sent over the connection.

ดังนั้นในกรณีของคุณคุณต้องการสิ่งนี้:

rsync -z MyBackups user@server:/path/to/backup/

ไฟล์จะถูกบีบอัดในระหว่างการขนส่งและมาถึงการแตกไฟล์ที่ปลายทาง


ตัวเลือกเพิ่มเติม:

  • scp ตัวเองสามารถบีบอัดข้อมูล

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • อาจมีวิธีในการรับrsyncและ7zaเล่นได้ดี แต่ไม่มีประโยชน์ในการทำเช่นนั้น ประโยชน์ของrsyncมันคือมันจะคัดลอกบิตที่มีการเปลี่ยนแปลงระหว่างไฟล์ท้องถิ่นและระยะไกล อย่างไรก็ตามการเปลี่ยนแปลงโลคัลขนาดเล็กอาจส่งผลให้ไฟล์บีบอัดแตกต่างกันมากดังนั้นจึงไม่มีประโยชน์ในการใช้ไฟล์rsyncนี้ มันซับซ้อนเพียงเรื่องที่ไม่มีประโยชน์ เพียงใช้โดยตรงsshดังที่แสดงด้านบน หากคุณจริงๆต้องการที่จะทำเช่นนี้คุณสามารถลองโดยให้ subshell rsyncเป็นอาร์กิวเมนต์ไปยัง ในระบบของฉันฉันไม่สามารถใช้7zaมันได้เพราะมันไม่อนุญาตให้คุณเขียนข้อมูลที่บีบอัดไปยังเทอร์มินัล บางทีการใช้งานของคุณอาจแตกต่างกัน ลองสิ่งที่ชอบ ( สิ่งนี้ไม่ได้ผลสำหรับฉัน ):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • ประเด็นก็คือว่า7z ไม่ควรนำมาใช้สำหรับการสำรองข้อมูลบน Linux ตามที่ระบุไว้ใน7zหน้าคน:

    ห้ามใช้รูปแบบ 7-zip เพื่อการสำรองข้อมูลบน Linux / Unix เพราะ:
    - 7-zip ไม่ได้จัดเก็บเจ้าของ / กลุ่มของไฟล์


3
ข้อควรทราบที่ควรเพิ่มคือถ้าคุณไม่ถ่ายโอนผ่านเครือข่ายที่ช้าโดยทั่วไปพูดอินเทอร์เน็ตคุณควรหลีกเลี่ยงการบีบอัดเนื่องจากจะทำให้อัตราการถ่ายโอนช้าลง บน LAN -zจะช้าอย่างน้อยสองเท่า สำหรับความเร็วที่มากกว่า rsyncing over ssh ให้ตั้งค่า rsync daemon และ rsync โดยใช้-Wแฟ
ล็ก

2
ขอบคุณ! ฉันจะยอมรับคำตอบที่ดีนี้ แต่โปรดเพิ่มเต็มบรรทัดคำสั่งแบบสแตนด์อะโลนที่ใช้ทั้งสองrsync และ 7zaมีผลผลิตสุดท้ายที่จะระบบแฟ้มระยะไกล ฉันชอบ-zแต่ฉันอยากจะแยกขั้นตอนการบีบอัดดังนั้น .. ฉันจะใช้rsyncในกรณีนี้ได้อย่างไร
Robottinosino

2
@Robottinosino ดูคำตอบที่ปรับปรุงแล้ว มีจุดในการใช้ไม่เป็นด้วยrsync 7zมันควรจะทำงานร่วมกับ rsync และ subshel ที่แสดง แต่ฉันไม่สามารถคิดออกว่าอยู่แล้ว
terdon

4
+1 scp -Cสำหรับ มีพื้นที่ไม่เพียงพอในดิสก์ระยะไกลเพื่อเก็บไฟล์บีบอัดดังนั้นฉันไม่สามารถบีบอัดก่อนโอน ตัวเลือกบรรทัดคำสั่งเล็กน้อยตัวหนึ่งทำให้ปัญหาของฉันหายไป
37931

1
@ Knutole เพียงแค่ซิปไฟล์ก่อนจากนั้นจึงซิงค์มัน โปรดถามคำถามใหม่หากคุณต้องการรายละเอียดเพิ่มเติม
terdon

13

ฉันคิดว่าคำสั่งนี้จะทำเคล็ดลับ

ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

แก้ไข: รุ่นก่อนหน้ามีตัวเลือก "f" ที่ผิดสองตัว

ตอนนี้ก่อนอื่นคุณต้องดำเนินการคำสั่งนี้จากโฮสต์เป้าหมาย และรายละเอียดที่จะอธิบาย:

  1. ssh user @ host จะเปิดการเชื่อมต่อไปยังเครื่องโฮสต์จากที่ที่จะทำการถ่ายโอนข้อมูล
  2. cd / path / to / data จะนำไปยังไดเรกทอรีที่จัดเก็บข้อมูลที่ต้องการ
  3. tar zc * จะเริ่มต้นการบีบอัดและวางลงใน STDOUT
  4. ตอนนี้ไปป์ (|) จะไปป์ไลน์ STDOUT ของแหล่งที่มาไปยัง STDIN ของปลายทางที่ "tar zx" กำลังทำงานและสตรีมข้อมูลการบีบอัดอย่างต่อเนื่องมาจากแหล่งที่มา

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

การอ้างอิง


tar: ตัวเลือกเก่า 'f' ต้องการอาร์กิวเมนต์
Dimitri Kopriwa

7

การปรับปรุงเล็กน้อยสำหรับคำตอบของ dkbhadeshiya : คุณไม่ต้องทำcd dirเพียงระบุไดเรกทอรีทำงานtarแทน:

ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 

คุณยังสามารถอัปโหลดไดเรกทอรีได้ในลักษณะเดียวกัน:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.