Cách tốt nhất để truyền tệp qua mạng LAN giữa hai máy tính Linux


77

Tôi muốn chuyển các tập tin (một thư mục nhạc) giữa hai máy tính Linux. Sau khi tìm kiếm cách tốt nhất để làm điều này, tôi đã thấy rằng có rất nhiều cách để làm điều này. Tôi biết điều này đã được hỏi rất nhiều , ở mọi nơimọi lúc . Vấn đề chính với điều này là không có sự đồng thuận rõ ràng, gần đây về một cách tốt nhất để thực hiện nhiệm vụ này vào năm 2011 cho người mới bắt đầu Linux (thậm chí phụ thuộc vào một số tham số).

Vì vậy, theo tinh thần của các trang web Stack Exchange, tôi muốn điều này không liên quan đến tình huống cụ thể của tôi, mà là hướng dẫn cho những người khác cũng như cách chuyển tệp giữa hai máy tính Linux qua mạng cục bộ. Tôi nghĩ rằng một wiki sẽ hữu ích cho nhiều người.

Đây là những gì tôi tìm thấy cho đến nay:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • người cho

Dễ nhất là gì? Linh hoạt nhất? Đơn giản nhất? Giải pháp tốt nhất? Những ưu và nhược điểm của mỗi là gì? Có những lựa chọn khác (tốt hơn)? Các tham số trong việc chọn phương pháp tốt nhất (giải pháp có thể phụ thuộc vào số lượng tệp, kích thước tệp, mức độ dễ dàng so với tính linh hoạt, ...)?


2
Bất cứ ai có thể giải thích rsync đến để chơi trong tất cả những điều này?
Konerak

jonallard, vui lòng không thêm câu trả lời cho câu hỏi (không thực sự có ý nghĩa để làm điều này phải không?) - nếu bạn cảm thấy một số câu trả lời cần thêm thông tin, bạn có thể đề xuất các chỉnh sửa trên chúng hoặc tạo câu trả lời của riêng bạn trong đó tóm tắt tất cả mọi thứ!
slhck

Câu trả lời:


65

Trong môi trường Linux, để bảo mật và dễ sử dụng, ssh là cách tốt nhất để sử dụng. SSH, SSHFS, SCP và SFTP như bạn liệt kê đều là các dịch vụ khác nhau được xây dựng dựa trên giao thức SSH. SCP rất dễ sử dụng, nó hoạt động giống như CP nhưng bạn có thể cung cấp tên người dùng và máy trong đường dẫn. Vì vậy, chúng tôi có thể thực hiện một CP như thế nào cp ~/music/ ~/newmusic/, nhưng chúng tôi có thể dễ dàng thực hiện scp ~/music/ user@host:~/newmusicđể gửi nó đến máy tính có tên là máy chủ lưu trữ. Đó là nó - chúng ta không cần phải thiết lập bất cứ điều gì. Bạn sẽ được nhắc nhập mật khẩu tài khoản trên máy khác nếu bạn không có chứng chỉ hoặc một số xác thực khác được thiết lập (tất nhiên là chia sẻ các cài đặt đó với ssh).

SFTP là một công cụ giúp bạn dễ dàng thực hiện nhiều thao tác trên hệ thống tệp từ xa - nó hoạt động giống như FTP, nhưng nó chạy qua SSH nên nó an toàn và chỉ yêu cầu máy chủ SSH. man sftpsẽ cho bạn biết tất cả về cách sử dụng nó. Tôi không sử dụng SFTP chỉ để di chuyển một thư mục giữa hai máy, sẽ hữu ích hơn khi bạn có nhiều thao tác phải làm, như nếu bạn sắp xếp lại các tệp trên máy tính khác.

SSHFS chỉ mở rộng SFTP vào một hệ thống tệp: nó cho phép bạn gắn máy chủ ảo vào hệ thống tệp của mình, vì vậy các công cụ mạng xảy ra hoàn toàn trong suốt. SSHFS dành cho các thiết lập bán cố định, không chỉ là chuyển tập tin một lần. Phải mất thêm một số nỗ lực để thiết lập, mà bạn có thể đọc về trang web của dự án .

Nếu bạn cần làm việc trong môi trường hệ điều hành hỗn hợp, Samba trở thành lựa chọn tốt nhất tiếp theo của bạn. Windows và OS X hỗ trợ Samba hoàn toàn tự động và Linux cũng vậy mặc dù đôi khi rất khó sử dụng.


3
Chính xác là loại câu trả lời tôi mong muốn: đầy đủ, đầy đủ, chi tiết, đến mức.
jonallard

2
Mặc dù vậy, scpđể làm việc, chúng ta có cần thiết lập một số loại máy chủ ssh, người nghe hoặc bỏ chặn một cái gì đó ở phía bên kia không? Tôi đang gặp lỗi "Kết nối bị từ chối".
jonallard

2
scp sử dụng ssh, vì vậy nó sẽ hoạt động nếu SSH hoạt động. Tất nhiên, điều này có nghĩa là bạn cần phải có máy chủ SSH đang chạy (mặc định trong mọi bản phân phối linux tôi biết) và phải có kết nối (tường lửa, NAT, v.v. phải có ngoại lệ phù hợp).
jcrawfordor

8
Rõ ràng openssh-serverphải được cài đặt trong Ubuntu Natty.
jonallard

3
Lưu ý rằng sshsử dụng mã hóa, sẽ gây ra một số chi phí bổ sung. Nếu các máy tính liên quan có CPU khá chậm, điều này có thể tạo ra sự khác biệt. Trong trường hợp đó netcathoặc tương tự (xem câu trả lời của Caspar) có thể thích hợp hơn. Tất nhiên chỉ khi bạn không thực sự cần mã hóa (trong mạng LAN được bảo vệ).
sleske

59

Sở thích cá nhân của tôi cho các trường hợp bảo mật không quan trọng là netcat + tar :

Để gửi một thư mục, cd vào bên trong thư mục có nội dung bạn muốn gửi trên máy tính thực hiện việc gửi và thực hiện:

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

Trên máy tính nhận nội dung, cd đến nơi bạn muốn nội dung xuất hiện và thực hiện:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Thay thế $REMOTE_HOSTbằng ip / tên máy chủ của máy tính thực hiện việc gửi. Bạn cũng có thể sử dụng một cổng khác thay vì 45454.

Điều thực sự xảy ra ở đây là máy tính 'nhận' đang kết nối với máy tính gửi trên cổng 45454 và nhận nội dung tar'd và gzip'd của thư mục, và chuyển trực tiếp đến tar (và gzip) để trích xuất nó vào thư mục hiện tại.

Ví dụ nhanh (sử dụng localhost làm máy chủ từ xa)

Máy tính 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

Máy tính 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

kinda làm tôi nhớ đến sendnet và recnet từ các dịch vụ ipx của Novel ngày xưa ...
sum1stolemyname

4
## netcat + bzip2 có thể nhanh hơn một chút khi kết nối chậm ## Gửi máy chủ # cat file.txt | bzip2 -c | nc -l 1234 ## Máy chủ nhận # nc $ gửi_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar: Làm thế nào về việc chỉnh sửa câu trả lời này để đề xuất nén bzip2 hoặc lzma?
einpoklum

4
các -qtùy chọn chỉ ra rằng bạn đang sử dụng OpenBSD-netcat , trong khi gnu-netcat cũng là khá phổ biến (mặc định trong Arch Linux ). Bạn có thể mở rộng câu trả lời của mình để bao gồm cú pháp của gnu-netcat không?
Sebastian

1
Người đàn ông hiện tại nói về tùy chọn -l: "Lỗi sử dụng tùy chọn này kết hợp với các tùy chọn -p, -s hoặc -z", nhưng thật lạ là nó không gây ra lỗi khi sử dụng. Tôi nghĩ rằng sử dụng 'nc -l 45454' cũng sẽ hoạt động tốt.
Claudiu

19

Đối với di chuyển một lần, scp được khuyến khích.

Nhưng nếu bạn thấy rằng thư mục này có thể hoạt động và bạn cần di chuyển nó nhiều lần để giữ cho vị trí khác được cập nhật thì bạn có thể sử dụng rsync (với ssh).

Vì rsync có rất nhiều đối số nên tôi thường đặt nó trong một vỏ nhỏ để tôi hiểu đúng (mọi lúc). Ý tưởng là chỉ gửi những thứ đã thay đổi kể từ lần cuối cùng chạy.

#!/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/

Điều này sẽ di chuyển một thư mục có tên "/ home / media / music /" từ máy tính cục bộ sang máy tính có tên 192.168.0.33, sử dụng "nisse" của người dùng. Và xóa bất cứ thứ gì trên mục tiêu không tồn tại trên máy tính cục bộ.


1
+ cho rsync, có vẻ như nhanh hơn và rất hay nếu bạn phải đồng bộ hóa thư mục sau này
Wiesław Herr

Điều này có vẻ rất hứa hẹn (và dễ dàng sử dụng lại) nhưng tôi đã nhận được các thư mục và tệp có dấu cách và tôi đang gặp lỗi rsync: lỗi cú pháp hoặc lỗi sử dụng (mã 1) tại main.c (1348) [sender = 3.1.1] - - bất kỳ đề xuất?
Torben Gundtofte-Bruun

8

Tôi khuyên bạn nên thử các lựa chọn thay thế thay vì tiếp tục với SSH để di chuyển các tệp trong mạng LAN của riêng bạn vì chi phí là IMMENSE. Tôi sẽ đi với giải pháp của Caspar nếu giải pháp này vì bất kỳ lý do gì sẽ không hiệu quả với bạn:

Tại nguồn:

$ python3 -m http.server {PICK_YOUR_PORT}

Về đích:

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

Điều này sẽ không chỉ nhẹ hơn so với sử dụng SSH nhưng nhanh hơn nhiều với tốc độ từ 45 ~ 65MiB trên CAT6 UTP tiêu chuẩn.
Nếu bạn thực sự muốn tận dụng tối đa kết nối, hãy thử thay thế wgetbằng lftpvà sử dụng pget -n20mirror -rcác lệnh.


7

Nhanh nhất có lẽ là netcat(như caspar mô tả).

Tôi thích sự kết hợp của tar& ssh, an toàn và vẫn nhanh:

Trên nguồn

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

Làm điều đó như root, nó bảo vệ quyền tập tin. Hoặc sử dụng -ptrên cả hai mặt. Cũng -Scó thể được xem xét nếu bạn có các tệp thưa thớt.

Có thể giảm chi phí mã hóa sshnếu bạn sử dụng arcfourlàm mật mã hoạt động với openSSH:

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

Để cập nhật đường dẫn từ xa, rsynclà hoàn hảo:

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

1
FWIW, gần đây tôi đã thực hiện một thử nghiệm chuyển đổi giữa hai máy tính xách tay hiện đại được kết nối trực tiếp bằng cách sử dụng rsync cả với tùy chọn arcfour và không có đối số -e cụ thể. Tôi nhận thấy không có sự khác biệt về tốc độ.
Randy Syring

4

Nếu nó hoàn toàn phải được thực hiện qua mạng LAN, tôi sẽ sử dụng rsync, vì nó sẽ chọn nơi nó bị tắt nếu nó bị gián đoạn. Nó cũng có một vài thủ thuật khác để giảm thiểu lượng dữ liệu được truyền, mặc dù tôi nghi ngờ rằng nhiều / bất kỳ trong số chúng có liên quan đến trường hợp sao chép thư viện nhạc vào vị trí còn trinh. Nếu bảo mật là một mối quan tâm, chỉ cần đặt RSYNC_RSH=sshđầu tiên và dữ liệu sẽ được chuyển qua ssh.

Tuy nhiên, nếu tôi thực sự làm việc đó, có lẽ tôi sẽ không sử dụng mạng LAN. Tôi sẽ sao chép các tập tin vào, sau đó tắt, một ổ cứng USB. Theo kinh nghiệm của tôi, điều này có thể dễ dàng nhanh hơn nhiều lần so với truyền qua mạng LAN, mặc dù phải sao chép các tệp hai lần - USB 2.0 được đánh giá là 480Mb / giây, nhanh hơn bất kỳ thứ gì thiếu ethernet gigabit, cộng với nó ít nhạy cảm hơn với các điều kiện sẽ làm giảm hiệu suất của mạng LAN. Nó cũng hoàn toàn độc lập với hệ điều hành, miễn là bạn sử dụng một hệ thống tệp mà tất cả các máy liên quan đều có thể xử lý - Tôi khuyên dùng VFAT / FAT32, vì nó khá phổ biến.


1
Tôi cũng là một fan hâm mộ của sneakernet (được gọi là), nhưng đáng để chỉ ra rằng trong khi USB 2 được cho là có thể nhận được 480Mb / giây, tôi chỉ thấy nó có tốc độ 30 MB / giây (khoảng 240Mb / giây). . có lẽ tôi chỉ có USB giá rẻ <-> phần cứng SATA;) Ngoài ra, FAT32 khá phổ biến nhưng không thể sao chép những thứ như hình ảnh DVD do hạn chế kích thước tệp 4gb; thật đáng để chỉ ra để mọi người không quá nản lòng với thông báo lỗi "hết dung lượng" mà Windows (ít nhất) đưa ra.
Caspar

@Caspar: Hãy cẩn thận! Cảm ơn đã đề cập đến chúng; Tôi luôn quên giới hạn kích thước tệp FAT32 ...
Dave Sherohman

2

Tôi sẽ đề nghị rsync vì nó sẽ sao chép các tập tin tăng dần. Bạn có thể thiết lập nó để sao chép chỉ các tệp mới được sửa đổi hoặc mới sau khi bạn thực hiện cập nhật ban đầu. Bạn có thể sử dụng ssh như một lớp vận chuyển nếu bạn muốn.


1

Tôi sử dụng Unison , một trình đồng bộ hóa tệp tuyệt vời qua nhiều giao thức khác nhau. Bạn có thể cấu hình nó để sử dụng scp, rcp, ftphoặc thậm chí cục bộ trên hệ thống tập tin giữa hai thư mục. Tôi sử dụng nó để đồng bộ hóa thư viện nhạc của mình, vì nó có thể truyền nhiều tệp cùng một lúc qua mạng và thực sự có thể điều chỉnh trong cấu hình của nó. Tôi giữ bộ sưu tập nhạc của mình được sao lưu và đồng bộ hóa trên 2-3 máy tính. Nó sẽ chỉ sao chép các tệp đã thay đổi và thực hiện bằng cách giữ một chỉ mục ở cả hai đầu của quá trình chuyển để có thể biết khi nào máy khách thay đổi tệp hoặc khi tệp máy chủ thay đổi.

Số dặm của bạn có thể thay đổi, nhưng chắc chắn sẽ tốt hơn rất nhiều so với scpviệc thu thập toàn bộ bộ sưu tập nhạc của bạn mỗi khi bạn thêm một bài hát mới :)


0

Tôi đã theo dõi quá trình ssh để đăng nhập không cần mật khẩu trước tiên http://www.tecmint.com/ssh-passwordless-login-USE-ssh-keygen-in-5-easy-steps/

Đối với tập lệnh và tập tin văn bản, các công việc sau đây đối với tôi tốt

Để truyền dữ liệu từ máy chủ cục bộ đến máy chủ từ xa. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Để truyền dữ liệu từ máy chủ từ xa đến máy chủ cục bộ. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Công việc này giúp tôi chuyển các tệp trên các hệ thống nhúng không có ssh client hoặc scp tích hợp.

Không có scp - chỉ ssh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.