วิธีที่ดีที่สุดในการถ่ายโอนไฟล์ผ่าน LAN ระหว่างคอมพิวเตอร์ Linux สองเครื่อง


77

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

ดังนั้นในเจตนารมณ์ของเว็บไซต์ Stack Exchange ฉันไม่ต้องการให้สิ่งนี้เกี่ยวข้องกับสถานการณ์เฉพาะของฉัน แต่มีคำแนะนำเพิ่มเติมให้กับผู้อื่นรวมถึงวิธีการถ่ายโอนไฟล์ระหว่างคอมพิวเตอร์ Linux สองเครื่องผ่านเครือข่ายท้องถิ่น ฉันคิดว่า wiki จะมีประโยชน์สำหรับหลาย ๆ คน

นี่คือสิ่งที่ฉันพบ:

  • SSH
  • sshfs
  • SCP
  • SFTP
  • NFS
  • แซมบ้า
  • คนที่มอบให้

วิธีที่ง่ายที่สุดคืออะไร? ยืดหยุ่นที่สุด? ที่ง่ายที่สุด? ทางออกที่ดีที่สุด? ข้อดีและข้อเสียของแต่ละข้อคืออะไร? มีตัวเลือกอื่น ๆ (ดีกว่า)? พารามิเตอร์ในการเลือกวิธีที่ดีที่สุดคืออะไร (โซลูชันอาจขึ้นอยู่กับจำนวนไฟล์ขนาดไฟล์ความง่ายและความยืดหยุ่น ... )


2
ทุกคนสามารถอธิบายได้ว่า rsync มาเล่นที่ใดในนี้
Konerak

โปรดอย่าเพิ่มคำตอบสำหรับคำถาม (ไม่เหมาะสมที่จะทำสิ่งนี้จริง ๆ ใช่ไหม?) - ถ้าคุณรู้สึกว่าคำตอบบางอย่างต้องการข้อมูลเพิ่มเติมคุณสามารถแนะนำการแก้ไขหรือสร้างคำตอบของคุณเอง ซึ่งสรุปทุกอย่าง!
slhck

คำตอบ:


65

ในสภาพแวดล้อม Linux เพื่อความปลอดภัยและใช้งานง่าย ssh เป็นวิธีที่ดีที่สุด SSH, SSHFS, SCP และ SFTP เนื่องจากรายการของคุณนั้นเป็นเพียงบริการต่าง ๆ ที่สร้างขึ้นบนโปรโตคอล SSH SCP ใช้งานง่ายมากทำงานได้เหมือนกับ CP แต่คุณสามารถระบุชื่อผู้ใช้และชื่อเครื่องจักรในเส้นทาง ดังนั้นเราอาจทำ CP เหมือนcp ~/music/ ~/newmusic/กัน แต่เราสามารถทำได้อย่างง่ายดายscp ~/music/ user@host:~/newmusicเพื่อส่งไปยังคอมพิวเตอร์ที่มีชื่อว่า host แค่นั้นแหละ - เราไม่จำเป็นต้องตั้งค่าอะไรเลย คุณจะได้รับแจ้งให้ใส่รหัสผ่านของบัญชีในเครื่องอื่นหากคุณไม่มีใบรับรองหรือการตั้งค่าการรับรองความถูกต้องอื่น ๆ (scp แชร์การตั้งค่าเหล่านั้นกับ ssh แน่นอน)

SFTP เป็นเครื่องมือที่ทำให้ง่ายต่อการทำงานมากมายในระบบไฟล์ระยะไกล - ทำงานได้เหมือน FTP แต่ทำงานผ่าน SSH ดังนั้นมันจึงปลอดภัยและต้องใช้เซิร์ฟเวอร์ SSH เท่านั้น man sftpจะบอกคุณทั้งหมดเกี่ยวกับวิธีการใช้งาน ฉันไม่ได้ใช้ SFTP เพื่อย้ายโฟลเดอร์ระหว่างเครื่องสองเครื่องมันมีประโยชน์มากกว่าเมื่อคุณมีการดำเนินการมากมายที่ต้องทำเช่นถ้าคุณกำลังจัดเรียงไฟล์บนคอมพิวเตอร์เครื่องอื่น

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

หากคุณต้องการทำงานในสภาพแวดล้อมแบบผสมระบบปฏิบัติการแซมบ้าจะกลายเป็นทางออกที่ดีที่สุดของคุณต่อไป Windows และ OS X รองรับ Samba โดยอัตโนมัติอย่างสมบูรณ์และ Linux ทำได้เช่นกันแม้ว่าบางครั้งมันก็ยากที่จะใช้


3
ประเภทของคำตอบที่ฉันต้องการ: ครบถ้วนครบถ้วนสมบูรณ์มีรายละเอียดตรงประเด็น
jonallard

2
แต่สิ่งหนึ่งที่scpเราจำเป็นต้องใช้ในการตั้งค่าเซิร์ฟเวอร์ ssh, ผู้ฟังหรือปลดล็อคบางอย่างในอีกด้านหนึ่งเป็นสิ่งจำเป็นหรือไม่ ฉันได้รับข้อผิดพลาด "การเชื่อมต่อถูกปฏิเสธ"
jonallard

2
scp ใช้ ssh ดังนั้นมันจะทำงานถ้า SSH ทำงาน ซึ่งหมายความว่าคุณต้องมีเซิร์ฟเวอร์ SSH ที่ทำงานอยู่ (ค่าเริ่มต้นในทุก ๆ linux distro ที่ฉันทราบ) และการเชื่อมต่อจะต้องเป็นไปได้ (ไฟร์วอลล์, NAT, ฯลฯ จะต้องมีข้อยกเว้นที่เหมาะสม)
jcrawfordor

8
เห็นได้ชัดว่าopenssh-serverจะต้องมีการติดตั้งใน Ubuntu Natty
jonallard

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

59

รายการโปรดส่วนตัวของฉันสำหรับกรณีที่ความปลอดภัยไม่สำคัญคือnetcat + tar :

ในการส่งไดเรกทอรีให้ไปที่ไดเรกทอรีที่มีเนื้อหาที่คุณต้องการส่งในคอมพิวเตอร์ที่ทำการส่งและทำ:

tar -cz . | nc -q 10 -l -p 45454

บนคอมพิวเตอร์ที่ได้รับเนื้อหาให้ไปที่ที่คุณต้องการให้เนื้อหาปรากฏและทำดังนี้

nc -w 10 $REMOTE_HOST 45454 | tar -xz

แทนที่$REMOTE_HOSTด้วย ip / ชื่อโฮสต์ของคอมพิวเตอร์ที่ทำการส่ง คุณสามารถใช้พอร์ตอื่นแทน45454ได้

สิ่งที่เกิดขึ้นจริงที่นี่คือคอมพิวเตอร์ 'ที่ได้รับ' กำลังเชื่อมต่อกับคอมพิวเตอร์ที่ส่งในพอร์ต 45454 และรับ tar'd และ gzip'd เนื้อหาของไดเรกทอรีและส่งตรงไปที่ tar (และ gzip) เพื่อแยกมันออก ไดเรกทอรีปัจจุบัน

ตัวอย่างด่วน (ใช้ localhost เป็นรีโมตโฮสต์)

คอมพิวเตอร์ 1

caspar@jumpy:~/nctest/a/mydir$ ls
file_a.txt  file_b.log
caspar@jumpy:~/nctest/a/mydir$ tar -cz . | nc -q 10 -l -p 45454

คอมพิวเตอร์ 2

caspar@jumpy:~/nctest/b$ ls
caspar@jumpy:~/nctest/b$ nc -w 10 localhost 45454 | tar -xz
caspar@jumpy:~/nctest/b$ ls
file_a.txt  file_b.log

ค่อนข้างทำให้ฉันนึกถึง sendnet และ recnet จากบริการ ipx ของ Novel ในสมัยก่อน ...
sum1stolemyname

4
## netcat + bzip2 อาจเร็วขึ้นเล็กน้อยในการเชื่อมต่อที่ช้า ## ส่งเซิร์ฟเวอร์ # cat file.txt | bzip2 -c | nc -l 1234 ## เซิร์ฟเวอร์ที่รับ # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar: วิธีแก้ไขคำตอบนี้เพื่อแนะนำการบีบอัด bzip2 หรือ lzma?
einpoklum

4
-qตัวเลือกที่บ่งบอกว่าคุณกำลังใช้OpenBSD-netcatขณะGNU-netcatยังเป็นเรื่องธรรมดามาก (ค่าเริ่มต้นในArch Linux ) คุณสามารถขยายคำตอบเพื่อรวมไวยากรณ์ของgnu-netcat ได้หรือไม่?
เซบาสเตียน

1
ชาย nc ปัจจุบันพูดถึงตัวเลือก -l: "เป็นข้อผิดพลาดในการใช้ตัวเลือกนี้ร่วมกับตัวเลือก -p, -s หรือ -z" แต่แปลกที่มันจะไม่เกิดข้อผิดพลาดเมื่อใช้งาน ฉันคิดว่าการใช้ 'nc -l 45454' น่าจะใช้ได้เหมือนกัน
Claudiu

19

สำหรับการเคลื่อนไหวครั้งเดียวขอแนะนำให้ใช้ scp

แต่ถ้าคุณพบว่า dir นี้อาจทำงานได้และคุณต้องย้ายหลายครั้งเพื่อให้ตำแหน่งอื่น ๆ อัปเดตอยู่คุณสามารถใช้ rsync (with ssh)

เนื่องจาก rsync มีข้อโต้แย้งมากมายฉันมักจะใส่มันไว้ในเปลือกเล็ก ๆ ดังนั้นฉันจึงพูดถูก (ทุกครั้ง) แนวคิดคือส่งสิ่งที่เปลี่ยนแปลงตั้งแต่ครั้งสุดท้ายที่มันวิ่ง

#!/bin/bash

user="nisse"
host="192.168.0.33"

echo "Sync: /home/media/music/"
rsync --archive --delete -v --progress -e "ssh -l $user " /home/media/music/ $host:/home/media/music/

สิ่งนี้จะย้าย dir ที่เรียกว่า "/ home / media / music /" จากโลคัลคอมพิวเตอร์ไปยังพีซีที่เรียกว่า 192.168.0.33 โดยใช้ผู้ใช้ "nisse" และลบสิ่งใด ๆ บนเป้าหมายที่ไม่มีอยู่ในพีซีในระบบ


1
+ สำหรับ rsync ซึ่งดูเหมือนว่าเร็วกว่าหน่อยและดีมากถ้าคุณต้องซิงค์ไดเรกทอรีในภายหลัง
Wiesław Herr

ดูเหมือนว่าจะมีแนวโน้มมาก (และสามารถนำมาใช้ซ้ำได้ง่าย) แต่ฉันมี dirs และไฟล์ที่มีช่องว่างและฉันได้รับข้อผิดพลาด rsync: ไวยากรณ์หรือข้อผิดพลาดในการใช้งาน (รหัส 1) ที่ main.c (1348) [sender = 3.1.1] - - ข้อเสนอแนะใด ๆ
Torben Gundtofte-Bruun

8

ฉันอยากจะแนะนำให้คุณลองใช้ทางเลือกอื่นแทน SSH โดยตรงสำหรับการย้ายไฟล์ภายใน LAN ของคุณเนื่องจากโอเวอร์เฮดนั้นเป็น IMMENSE ฉันจะไปกับทางออกของ Caspar ถ้าอันนี้ด้วยเหตุผลใดก็ตามจะไม่ทำงานสำหรับคุณ:

ที่แหล่งที่มา:

$ python3 -m http.server {PICK_YOUR_PORT}

บนปลายทาง:

$ wget -r {ip / hostname}:{port}/{File / Directory}

สิ่งนี้จะไม่เบากว่าการใช้ SSH แต่เร็วกว่าด้วยความเร็วตั้งแต่ 45 ~ 65MiB สำหรับ CAT6 UTP มาตรฐาน
หากคุณต้องการบีบการเชื่อมต่อให้มากที่สุดให้ลองแทนที่wgetด้วยlftpและใช้pget -n20และmirror -rคำสั่ง


7

อาจเร็วที่สุดnetcat(ตามที่อธิบายไว้ทั้งหมด)

ฉันชอบการรวมกันของtar& sshซึ่งปลอดภัยและรวดเร็ว:

เกี่ยวกับแหล่งกำเนิด

tar -cf - . | ( ssh user@target && cd /target/path && tar -xf - )

การทำเช่นนั้นในฐานะ root จะเป็นการสงวนสิทธิ์ของไฟล์ หรือใช้-pทั้งสองด้าน นอกจากนี้ยัง-Sอาจได้รับการพิจารณาถ้าคุณมีไฟล์เบาบาง

เป็นไปได้ที่จะลดค่าใช้จ่ายในการเข้ารหัสsshหากคุณใช้arcfourเป็นรหัสซึ่งทำงานร่วมกับ openSSH:

tar -cpSf - . | ( ssh -c arcfour user@targethost && cd /target/path && tar -xpSf - )

ในการอัพเดตเส้นทางระยะไกลrsyncนั้นสมบูรณ์แบบ:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path

1
FWIW ฉันเพิ่งทำการทดสอบการถ่ายโอนระหว่างแล็ปท็อปสมัยใหม่ที่เชื่อมต่อโดยตรงสองเครื่องโดยใช้ rsync ทั้งคู่กับตัวเลือก arcfour และไม่มีอาร์กิวเมนต์ -e เฉพาะ ฉันสังเกตเห็นว่าความเร็วไม่แตกต่างกัน
Randy Syring

4

ถ้ามันต้องทำผ่าน LAN อย่างแน่นอนฉันจะใช้rsyncเพราะมันจะไปรับที่ ๆ มันค้างไว้ถ้ามันถูกขัดจังหวะ นอกจากนี้ยังมีเทคนิคอื่น ๆ เล็กน้อยเพื่อลดจำนวนข้อมูลที่ถูกถ่ายโอนแม้ว่าฉันจะสงสัยว่าหลายคน / พวกเขาจะเกี่ยวข้องกับกรณีของการคัดลอกคลังเพลงไปยังตำแหน่งที่บริสุทธิ์ หากการรักษาความปลอดภัยเป็นเรื่องที่กังวลเพียงแค่ตั้งค่าRSYNC_RSH=sshก่อนและข้อมูลจะถูกส่งผ่านอุโมงค์ไปยัง ssh

ถ้าฉันทำมันจริง ๆ ฉันอาจจะไม่ใช้ LAN เลย ฉันจะคัดลอกไฟล์ไปไว้นอกฮาร์ดไดรฟ์ USB จากประสบการณ์ของฉันนี่อาจเป็นคำสั่งที่หลากหลายเร็วกว่าการไปที่ LAN แม้ว่าจะต้องคัดลอกไฟล์สองครั้งก็ตาม - USB 2.0 ได้รับการจัดอันดับสำหรับ 480Mbps ซึ่งเร็วกว่าสิ่งใดก็ตามที่กิกะบิตอีเธอร์เน็ตสั้น ซึ่งจะลดประสิทธิภาพของ LAN นอกจากนี้ยังเป็นอิสระจากระบบปฏิบัติการอย่างสมบูรณ์หากคุณใช้ระบบไฟล์ที่เครื่องที่เกี่ยวข้องทั้งหมดสามารถจัดการได้ - ฉันขอแนะนำ VFAT / FAT32 เนื่องจากมันเป็นสากลมาก


1
ฉันเป็นแฟนตัวยงของ sneakernet เช่นกัน แต่มันก็คุ้มค่าที่ชี้ให้เห็นว่าในขณะที่ USB 2 ควรจะได้รับ 480Mbps แต่ฉันเคยเห็นว่ามันได้รับ 30MB / s (ประมาณ 240Mbps) . บางทีฉันเพิ่งมีฮาร์ดแวร์ USB <-> SATA ราคาถูก;) นอกจากนี้ FAT32 ยังเป็นสากลมาก เป็นค่าที่ชี้ให้เห็นเพื่อที่ผู้คนจะไม่ได้รับความผิดหวังจากข้อความแสดงข้อผิดพลาด "out of space" ที่ Windows (อย่างน้อย) ให้
Caspar

@ คาสปาร์: คำเตือนที่ดี! ขอบคุณที่พูดถึงพวกเขา ฉันมักจะลืมเกี่ยวกับการ จำกัด ขนาดไฟล์ FAT32 ...
เดฟ Sherohman

2

ฉันอยากจะแนะนำ rsync เพราะมันจะคัดลอกไฟล์ที่เพิ่มขึ้น คุณสามารถตั้งค่าให้คัดลอกเฉพาะไฟล์ที่แก้ไขหรือใหม่เท่านั้นเมื่อคุณทำการอัพเดตครั้งแรกเสร็จสิ้น คุณสามารถใช้ ssh เป็นเลเยอร์การขนส่งได้หากต้องการ


1

ฉันใช้Unisonซึ่งเป็นไฟล์ซิงโครไนซ์ที่ยอดเยี่ยมสำหรับโปรโตคอลที่แตกต่างกัน คุณสามารถกำหนดค่าให้ใช้scp, rcp, ftpหรือแม้กระทั่งในประเทศในระบบแฟ้มระหว่างสองโฟลเดอร์ ฉันใช้มันเพื่อซิงโครไนซ์คลังเพลงของฉันเพราะมันสามารถถ่ายโอนไฟล์หลายไฟล์พร้อมกันผ่านเครือข่ายและสามารถปรับแต่งได้จริงๆในการกำหนดค่า ฉันสำรองคอลเล็กชันเพลงของฉันไว้และซิงค์กับคอมพิวเตอร์ 2-3 เครื่อง มันจะคัดลอกไฟล์ที่เปลี่ยนแปลงเท่านั้นและทำเช่นนั้นโดยเก็บดัชนีไว้ที่ปลายทั้งสองของการถ่ายโอนเพื่อให้สามารถบอกได้ว่าเมื่อใดที่ไคลเอนต์มีการเปลี่ยนแปลงไฟล์หรือเมื่อไฟล์เซิร์ฟเวอร์มีการเปลี่ยนแปลง

ระยะของคุณอาจแตกต่างกันไป แต่มันก็ดีกว่าscpคอลเล็กชั่นเพลงทั้งหมดของคุณทุกครั้งที่คุณเพิ่มเพลงใหม่ :)


0

ฉันได้ติดตามกระบวนการ ssh สำหรับการเข้าสู่ระบบแบบไม่ใช้รหัสผ่านครั้งแรกhttp://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

สำหรับสคริปต์และไฟล์ข้อความต่อไปนี้ใช้งานได้ดีสำหรับฉัน

เพื่อถ่ายโอนข้อมูลจากโลคัลโฮสต์ไปยังรีโมตโฮสต์ cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

เพื่อถ่ายโอนข้อมูลจากรีโมตโฮสต์ไปยังโลคัลโฮสต์ ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

สิ่งนี้ใช้ได้สำหรับฉันในการถ่ายโอนไฟล์บนระบบฝังตัวที่ไม่มีไคลเอ็นต์ ssh หรือ scp ในตัว

ไม่มี SCP - เฉพาะ ssh

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