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

jon*_*ard 90 linux lan file-transfer

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

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

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

  • ssh
  • sshfs
  • SCP
  • sftp
  • nfs
  • 桑巴
  • 给予者

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

jcr*_*dor 73

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

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

  • 显然,必须在 Ubuntu Natty 中安装“openssh-server”。 (8认同)
  • 正是我想要的那种答案:完整、详尽、详细、切中要害。 (3认同)
  • 请注意,`ssh` 使用加密,这会导致一些额外的开销。如果所涉及的计算机的 CPU 速度相当慢,这可能会有所不同。在这种情况下,`netcat` 或类似的(参见 Caspar 的回答)可能更可取。当然,前提是您实际上不需要加密(在受保护的 LAN 中)。 (3认同)
  • 但是有一件事,要让 `scp` 工作,我们是否需要设置某种 ssh 服务器、侦听器或在另一端解锁某些东西?我收到“连接被拒绝”错误。 (2认同)
  • scp 使用 ssh,所以如果 SSH 工作,它就会工作。当然,这意味着您需要运行 SSH 服务器(我知道的每个 Linux 发行版中都是默认设置)并且必须可以连接(防火墙、NAT 等必须有适当的例外)。 (2认同)
  • 专业提示:如果您[设置 SSH 连接共享](http://fermiparadox.wordpress.com/2008/06/19/ssh-connection-sharing/),则在使用 SCP 时,制表符补全将适用于远程主机上的文件。真正的电脑魔法! (2认同)

Cas*_*par 68

对于安全无关紧要的情况,我个人最喜欢的是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'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
Run Code Online (Sandbox Code Playgroud)

电脑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
Run Code Online (Sandbox Code Playgroud)

  • ## netcat + bzip2 在慢速连接上可能会快一些 ## 发送服务器 # cat file.txt | bzip2 -c | nc -l 1234 ## 接收服务器# nc $sending_ip 1234 | bzip2 -cd > file.txt (4认同)
  • `-q` 选项表示您正在使用 **openbsd-netcat**,而 **gnu-netcat** 也很常见(*Arch Linux* 中的默认设置)。您能否扩展您的答案以包含 **gnu-netcat** 的语法? (4认同)
  • @JackWasey 对于一次性传输,这比安装 SSH 服务器、编辑 SSH 配置文件以允许连接(默认情况下可能被禁用)、设置身份验证然后仍然需要研究语法更容易,因为我不无论如何知道如何使用 scp (它看起来一点也不复杂,所以我可能应该学习它) (2认同)

Joh*_*han 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/
Run Code Online (Sandbox Code Playgroud)

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


sol*_*olr 12

我建议您尝试替代方案,而不是直接使用 SSH 在您自己的局域网内移动文件,因为开销很大。如果这个解决方案无论出于何种原因对您不起作用,我都会采用 Caspar 的解决方案:

在源头:

$ python3 -m http.server {PICK_YOUR_PORT}
Run Code Online (Sandbox Code Playgroud)

在目的地:

$ wget -r {ip / hostname}:{port}/{File / Directory}
Run Code Online (Sandbox Code Playgroud)

这不仅比使用 SSH 更轻,而且在标准 CAT6 UTP 上的速度范围为 45~65MiB 时要快得多。
如果你真的想挤进最出连接尝试的更换wgetlftp使用pget -n20mirror -r命令。


Tim*_*ele 9

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

我喜欢tar&的组合ssh,它既安全又快速:

在源头上

tar -cf - . | ( ssh user@target && cd /target/path && tar -xf - )
Run Code Online (Sandbox Code Playgroud)

以 root 身份执行此操作,它会保留文件权限。或-p两面使用。此外-S,如果你有稀疏文件可能会被考虑。

ssh如果您使用arcfour与 openSSH 一起使用的密码,则可以减少加密开销:

tar -cpSf - . | ( ssh -c arcfour user@targethost && cd /target/path && tar -xpSf - )
Run Code Online (Sandbox Code Playgroud)

更新远程路径,rsync是完美的:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Run Code Online (Sandbox Code Playgroud)


Dav*_*man 5

如果绝对必须通过 LAN 完成,我会使用rsync,因为如果它被中断,它将从中断的地方继续。它还有一些其他技巧可以最大限度地减少传输的数据量,尽管我怀疑其中许多/任何技巧与将音乐库复制到原始位置的情况相关。如果考虑安全性,只需RSYNC_RSH=ssh先设置,数据将通过 ssh 隧道传输。

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


小智 5

提到了很多很棒的答案,我想我应该添加另一个替代方案,rclone,它是我个人最喜欢的,因为它支持许多云存储提供商并支持 Windows。

在主机上:

rclone serve sftp . --addr 0.0.0.0:2222
Run Code Online (Sandbox Code Playgroud)

这将启动 SFTP 服务器,监听所有地址的端口 2222。默认情况下它将使用当前用户的授权密钥文件( ~/.ssh/authorized_keys)

在客户端系统上:

您可以使用任何支持 SFTP 的 GUI 或 CLI 程序。不幸的是,它似乎不支持SCP。但是你可以在终端中连接到SFTP服务器,类似于

sftp -P 2222 dave@10.75.0.200
Run Code Online (Sandbox Code Playgroud)

rclone 服务命令如果您仅限于某种协议,rcloneserve 命令还支持其他协议,包括 Webdav、DLNA、FTP、HTTP(s

如果需要同步两个文件夹,可以使用内置的同步命令。但是,您需要配置 rclone,使用rclone config并添加远程 FTP/SFTP 服务器。

一个例子:

rclone sync /home/dave/projects localSftpServer:projects
Run Code Online (Sandbox Code Playgroud)