วิธีที่ง่ายที่สุดสำหรับการโอนไฟล์ระหว่างเซิร์ฟเวอร์ linux อย่างรวดเร็ว?


16

ฉันต้องการถ่ายโอนไฟล์จากเซิร์ฟเวอร์ CentOS หนึ่งไปยังเซิร์ฟเวอร์อื่น จะถ่ายโอนไฟล์ 5MB ประมาณทุกๆ 10 นาที ไม่ต้องการการเข้ารหัส

อะไรคือความง่ายในการถ่ายโอนไฟล์ที่รวดเร็ว?

มีบางอย่างที่ง่ายกว่า ftp หรือไม่?

ขอบคุณ!


1
ฉันมีศรัทธาที่ tar เหนือ netcat จะประสบความสำเร็จ ... heh heh ... : serverfault.com/questions/18125/…
Evan Anderson

เนื่องจากฉันไม่ต้องการการเข้ารหัส แต่ต้องการความเร็วฉันชอบ rsync
Alex L

ฉันเพิ่งเรียนรู้ว่าการถ่ายโอน http ไม่มีค่าใช้จ่ายมากนักบางทีฉันก็สามารถใช้มันได้
Alex L

อย่าแก้ไขคำตอบในคำถามของคุณโพสต์เป็นคำตอบแทน Rolledback
HopelessN00b

สำหรับ "fast" โปรดดูunix.stackexchange.com/questions/48399/…
rogerdpack

คำตอบ:


25

rsync

ฉันจะใช้ rsync ก่อนที่ฉันจะใช้ ftp หรือ tftp

ตัวเลือกเพิ่มเติมและ (จากประสบการณ์ของฉัน) การถ่ายโอนที่เชื่อถือได้มากขึ้น


1
ฉันยังพบว่า rsync มักจะได้รับ throughput สูงกว่าสิ่งอื่น (SCP, CIFS, NFS)
งู

http การถ่ายโอนคืออะไร?
Alex L

@Ophidian คุณหมายถึงการใช้ rsync เป็น daemon หรือไม่? มิฉะนั้นจะสามารถทำได้เร็วกว่า scp เนื่องจากทั้งสองใช้ ssh และมีการเข้ารหัส
balki

@balki ใช่ rsync daemon มันไม่ได้ช่างพูดเก่งทำงานได้ดีในการป้อนข้อมูลจากดิสก์ลงบนบรรทัดและมันก็ทำงานได้น้อยตามความจำเป็นเพื่อให้คำขอเสร็จสมบูรณ์ (ใช้ diffs สำหรับไฟล์ข้อความเป็นต้น)
Ophidian

21

tar over ssh ก็โอเค แต่ tar over TCP ผ่าน netcat นั้นมีค่าใช้จ่ายต่ำคุณสามารถรับได้! หากนี่คือสิ่งที่ครั้งเดียวให้ยิงนี่:

บนเครื่องรับ:

nc -l -p 8989 | tar x

บนผู้ส่ง:

tar cf - /source-path | nc (receiving host ip address) 8989

หากนี่คือสิ่งที่คุณจะทำเป็นประจำฉันอาจใช้ rsync


+1 สำหรับ netcat มีดกองทัพสวิส
chmeee

เช่นเดียวกับคุณที่ไม่ได้อ่านอีวาน ฮ่าฮ่าฮ่า! มันไม่ได้เป็นเพียงครั้งเดียว เขาบอกว่าเขากำลังจะถ่ายโอนไฟล์ 5MB ประมาณทุกๆ 10 นาที บางทีการส่งรหัสมอร์สอาจเป็นทางเลือกที่ดี? ;-) (หมายเหตุ: เรื่องตลกส่วนตัวระหว่าง Evan และตัวฉันเอง)
KPWINC

8

คนสองคนพูดถึงน้ำมันดินมากกว่า ssh แต่ไม่ได้พูดว่าจะทำอย่างไร สำหรับเร็กคอร์ดขั้นตอนพื้นฐานคือการรัน:

tar cf - files... | ssh remotehost 'cd /destination && tar xvf -'

หรือถ้าคุณต้องการเริ่มต้นการโอนจากจุดสิ้นสุดการรับ:

ssh remotehost 'cd /source && tar cf - files' | tar xvf -

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

ssh มีตัวเลือก -C เพื่อบีบอัดสตรีมข้อมูลหรือคุณสามารถใช้ความสามารถในการบีบอัดในตัวของ GNU tar:

tar zcf - files... | ssh remotehost 'cd /destination && tar xzvf -'

Rsync เป็นอีกตัวเลือกหนึ่ง แต่ชุดที่แข็งแกร่งคือการอัพเดทไฟล์ที่มีอยู่แล้วในตอนท้ายของการรับ ฉันพบว่ามันช้ากว่า scp หรือ tar / ssh เมื่อใช้มันเพื่อถ่ายโอนไฟล์ที่ไม่มีอยู่ในส่วนอื่น ๆ


1
+1 อะไรที่คุณหมายถึงไม่ใช่ทุกคนที่รู้วิธีการทำ ssh? แปลก. :)
ความวุ่นวาย

tar ด้วยตัวเองไม่น่าเชื่อถือ - ไม่มีการตรวจสอบความสมบูรณ์ แต่ด้วย SSH (TLS) คุณจะได้รับความสมบูรณ์เนื่องจากความสามารถของ TLS ในการตรวจจับการเปลี่ยนแปลงข้อมูลเที่ยวบิน Rsync เป็นตัวเลือกที่ดีกว่าและ Rsync จะทำการตรวจสอบความสมบูรณ์โดยไม่มีการเข้ารหัส การเข้ารหัสที่ระบุไว้ OP ไม่จำเป็น
กิโล

การตรวจสอบความสมบูรณ์ของทาร์ต้องการอะไร? เลเยอร์ TCP และ ssh ให้การขนส่งข้อมูลที่เชื่อถือได้ หากคุณยืนยันว่าน้ำมันดินนั้นสามารถมีข้อบกพร่องได้คุณต้องปฏิบัติต่อ rsync ด้วยวิธีเดียวกัน ในความเป็นจริงฉันมีการถ่ายโอน rsync ตรึงกับฉันเนื่องจากปัญหาโปรโตคอล ฉันจำไม่ได้ว่าท่อส่งน้ำมันดิน / ท่อส่งน้ำมันเคยทำเช่นนั้น
Kenster

6

ฉันจะใช้scpหรือtarมากกว่าsshโดยสุจริต การเข้ารหัสไม่สิ่งที่ช้าลง แต่ความสะดวกในการติดตั้งและใช้ความน่าเชื่อถือและ (จิตใจของหลักสูตร) คุ้นเคยทำให้ฉันยินดีที่จะใช้ตีจนกว่าฉันจริงๆต้องการความเร็วที่

คุณสามารถเพิ่มความเร็วในการถ่ายโอน ssh ด้วยการบอกให้ใช้ตัวเลขที่เร็วกว่าค่าเริ่มต้นเช่นกัน โดยปกติแล้วค่าเริ่มต้นจะเป็นแบบปกติ3desและคุณสามารถทำได้-c desเพื่อที่จะได้เร็วขึ้นอย่างเห็นได้ชัดและ-c blowfishแสดงอย่างรวดเร็วเช่นกันแม้ว่าฉันจะไม่ได้ทดสอบอย่างแน่นอน

(ย้อนกลับไปในสมัยของ SSHv1 คุณสามารถทำได้บ่อยครั้ง-c noneแต่ฉันคิดว่ามีคนตัดสินใจว่านั่นคือ juju ที่แย่)


4

ถ้าคุณต้องผ่าน scp / ssh การทดลองของฉันแสดงว่าตัวเลขที่เร็วที่สุดที่เปิดใช้งานโดยค่าเริ่มต้นคือ RC4 คุณระบุรหัสผ่าน ' -c arcfour ' ในคำสั่ง ssh / scp ของคุณ:

สำหรับการคัดลอกครั้งแรก:

  • scp -c arcfour -r foo/ desthost:/destdir

สำหรับการอัปเดต:

  • rsync -e 'ssh -c arcfour' -r foo/ desthost:/destdir

3

Rsync เป็นวิธีที่ดีที่จะไปเพราะถ้าคุณพบว่าตัวเองถ่ายโอนไฟล์เดียวกันมากกว่าหนึ่งครั้งมันจะเพิ่มความเร็วในการคัดลอกดังที่แสดงด้วยคำพูดนี้จากหน้าคน

   rsync is a program that behaves in much the same way that rcp does, but
   has many more options and uses  the  rsync  remote-update  protocol  to
   greatly  speed  up  file  transfers  when the destination file is being
   updated.
   The rsync remote-update protocol allows rsync to transfer just the dif-
   ferences between two sets of files across the network connection, using
   an efficient  checksum-search  algorithm  described  in  the  technical
   report that accompanies this package.

2

FTP นั้นค่อนข้างง่าย แต่วิธีที่ง่ายกว่าคือการสร้างการแชร์ NFS บนเครื่องหนึ่งและเชื่อมต่อกับอีกเครื่อง จากนั้นการคัดลอกไฟล์จะประกอบด้วยการทำ cp จากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง


ขึ้นอยู่กับข้อกำหนด ฉันจะไม่ใช้ NFS บนอินเทอร์เน็ตเป็นตัวอย่าง
Kyle Hodgson

1
จุดดี. ในกรณีนั้นฉันขอแนะนำ rsync เพราะมันสามารถกลับมาทำงานต่อได้หากถูกขัดจังหวะ อีกทั้งเนื่องจากมันโอนเดลตาระหว่างแหล่งที่มาและปลายทางเท่านั้น
Swoogan

คำถามทั่วไปมากฉันชอบ Soulution โพสต์โดย Swoogan โดยเฉพาะผู้เขียนที่กล่าวถึงว่าต้องการวิธีแก้ปัญหาที่ง่ายที่สุดและไม่ต้องการการเข้ารหัส
integratorIT

2

หากคุณต้องการความเร็วคุณสามารถใช้ netcat และ tar มันจะเร็วกว่า ssh, rsync หรือ scp ในเครือข่ายท้องถิ่นที่ไม่ต้องกังวลเรื่องการเข้ารหัส Google "netcat tar"

DestinationServer

nc -l -p 7878 | tar -C /target/dir -xzf -

SourceServer

tar -cz /source/dir | nc DestinationServer 7878

เห็นได้ชัดว่าต้องมีการติดตั้ง netcat จริง Google "netcat tar" สำหรับข้อมูลเพิ่มเติม


1

ฉันเชื่อว่าคุณได้แก้ไขปัญหาของคุณแล้ว แต่ในกรณีที่ ssh ของคุณทำงานบนพอร์ตอื่น (ไม่ใช่พอร์ตมาตรฐาน 22) คุณสามารถใช้สิ่งนี้

rsync -avz --rsh = 'ssh -pXXXXX' / local / dir / root@192.168.1.2: / remote / dir

หมายเหตุ: - แทนที่ XXXXX ด้วยหมายเลขพอร์ตของคุณ - แทนที่ 192.16.1.2 ด้วย IP เซิร์ฟเวอร์ระยะไกลที่ถูกต้อง


-1

https://www.npmjs.org/package/gist-cli

https://github.com/settings/applications#personal-access-tokens

หรืออันนี้:

https://github.com/defunkt/gist

ใช้คำสั่ง gist เพื่ออัพโหลดและดาวน์โหลด


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