在两台Linux计算机之间通过LAN传输文件的最佳方法


77

我想在两台Linux计算机之间传输文件(音乐文件夹)。在寻找最佳方法后,我发现有很多方法可以做到这一点。我知道这已经被问了很多到处都是所有的时间。这样做的主要问题是,对于Linux初学者来说,2011年完成此任务的最佳方法尚无明确的近期共识(甚至取决于某些参数)。

因此,本着Stack Exchange网站的精神,我希望这与我的特定情况不相关,而是更多地指导他人,以及如何在本地网络上的两台Linux计算机之间传输文件。我认为Wiki对许多人都是有用的。

这是我到目前为止发现的:

  • ssh
  • sshfs
  • scp
  • ftp
  • nfs
  • 桑巴舞
  • 给予者

最简单的是什么?最灵活?最简单?最佳解决方案?各自的优缺点是什么?还有其他(更好)的选择吗?选择最佳方法的参数是什么(解决方案可能取决于文件数,文件大小,易用性与灵活性,...)?


2
谁能解释在所有这些方面rsync发挥作用吗?
Konerak 2011年

jonallard,请不要在问题中添加答案(这样做不是很有意义,对吗?)-如果您认为某些答案需要其他信息,则可以建议对其进行编辑或创建自己的答案总结了一切!
slhck 2011年

Answers:


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用于半永久设置,而不仅仅是一次性文件传输。需要花费更多的精力来进行设置,您可以在项目网站上阅读有关内容。

如果您需要在混合OS环境中工作,那么Samba将成为您的下一个最佳选择。Windows和OS X完全自动支持Samba,而Linux也是如此,尽管有时很难使用。


3
正是我所希望的答案:完整,详尽,详尽。
jonallard

2
但是,scp要想起作用,有一件事是我们需要设置某种ssh服务器,侦听器还是在另一端取消阻止某些内容?我收到“连接被拒绝”错误。
jonallard

2
scp使用ssh,因此如果SSH有效,它将可以使用。当然,这意味着您需要运行SSH服务器(我知道的每个Linux发行版中的默认服务器),并且必须能够建立连接(防火墙,NAT等必须具有适当的例外)。
jcrawfordor 2011年

8
显然openssh-server必须在Ubuntu Natty中安装。
jonallard

3
请注意,ssh使用加密将导致一些额外的开销。如果所涉及的计算机具有相当慢的CPU,则可能会有所不同。在那种情况下netcat或类似的方法(请参阅Caspar的答案)可能更可取。当然,仅当您实际上不需要加密时(在受保护的LAN中)。
sleske

59

对于安全性无关紧要的情况,我个人最喜欢的是netcat + tar

要发送目录,请将cd转到要在计算机上发送其内容的目录内,然后执行以下操作:

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

在接收内容的计算机上,cd到要显示内容的位置并执行以下操作:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

$REMOTE_HOST执行发送的计算机的ip /主机名替换。您也可以使用其他端口代替45454

这里实际发生的是“接收”计算机正在端口45454上连接到发送计算机,并接收目录的tar和gzip内容,并将其直接传递到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

有点让我想起了从前的Novel的ipx服务中的sendnet和recnet ...
sum1stolemyname 2011年

4
## netcat + bzip2在连接速度较慢时可能会更快##发送服务器#cat file.txt | bzip2 -c | nc -l 1234 ##接收服务器#nc $ sending_ip 1234 | bzip2 -cd> file.txt
shantanuo 2011年

@Caspar:如何编辑此答案以建议使用bzip2或lzma压缩?
einpoklum 2013年

4
-q选项表明您正在使用openbsd-netcat,而gnu-netcat也很常见(Arch Linux中的默认设置)。您能否将答案扩展到包括gnu-netcat的语法?
塞巴斯蒂安

1
当前的nc管理员对-l选项说:“将此选项与-p,-s或-z选项一起使用是错误的”,但奇怪的是,在使用它时不会引发错误。我认为使用“ nc -l 45454”应该同样有效。
Claudiu 2014年

19

对于一次移动,建议使用scp。

但是,如果您发现此目录可能有效,并且需要多次移动它以保持另一个位置更新,则可以使用rsync(与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/

这将使用用户“ nisse”将名为“ / home / media / music /”的目录从本地计算机移至名为192.168.0.33的PC。并删除目标计算机上本地计算机上不存在的所有内容。


1
+ rsync,这似乎快一点,如果以后必须同步目录,则非常好
–WiesławHerr

这似乎非常有前途(并且易于重用),但是我的目录和文件带有空格,并且出现rsync错误:main.c(1348)[sender = 3.1.1]的语法或用法错误(代码1) - - 有什么建议么?
Torben Gundtofte-Bruun

8

我建议您尝试使用替代方法,而不要直接使用SSH在自己的LAN中移动文件,因为开销很大。如果无论出于何种原因该解决方案都不适合您,我将采用Caspar的解决方案:

从源头上:

$ python3 -m http.server {PICK_YOUR_PORT}

在目的地:

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

这不仅比使用SSH轻,而且速度更快,标准CAT6 UTP的速度范围为45〜65MiB。
如果您真的想最大限度地利用连接,请尝试替换wgetlftpand使用pget -n20and mirror -r命令。


7

最快的可能是netcat(如caspar所述)。

我喜欢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参数在两个直接连接的现代笔记本电脑之间进行了传输测试。我注意到速度没有差异。
兰迪·赛林

4

如果绝对必须通过LAN进行,则使用rsync,因为如果中断,它将在中断的地方继续进行。它还有一些其他技巧可以最大程度地减少传输的数据量,尽管我怀疑其中很多/其中任何一个都与将音乐库复制到原始位置的情况有关。如果需要考虑安全性,只需RSYNC_RSH=ssh先进行设置,然后数据将通过ssh传输。

但是,如果我真的在做,我可能根本不会使用LAN。我将文件复制到USB硬盘驱动器上,然后再从其中复制出来。以我的经验,尽管必须复制两次文件,但是这很容易比通过LAN快几个数量级-USB 2.0的额定速度为480Mbps,比没有千兆以太网的任何东西都要快,而且它对条件的敏感性较低这会降低局域网的性能。如果您使用所有相关机器都可以处理的文件系统,那么它也完全独立于操作系统,我建议使用VFAT / FAT32,因为它非常通用。


1
我也是(所谓的)sneakernet的粉丝,但值得指出的是,虽然USB 2应该能够获得480Mbps的速度,但我只见过它可以达到30MB / s(约240Mbps)的速度。也许我只是有便宜的USB <-> SATA硬件;)而且,FAT32几乎是通用的,但由于4gb文件大小的限制,它不能复制DVD映像之类的东西。值得指出的是,人们不会对Windows(至少)给出的“空间不足”错误消息感到沮丧。
卡斯珀

@Caspar:很好的警告!感谢您提及他们;我总是忘了FAT32文件大小的限制...
Dave Sherohman 2011年

2

我建议使用rsync,因为它将逐步复制文件。您可以将其设置为仅在完成初始更新后仅复制修改的文件或新文件。如果愿意,可以将ssh用作传输层。


1

我使用Unison,它是基于许多不同协议的出色文件同步器。您可以配置为使用scprcpftp两个文件夹之间,甚至在本地文件系统上的。我使用它来同步我的音乐库,因为它可以通过网络一次传输多个文件,并且其配置确实可以调整。我将音乐收藏备份并在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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.