“scp”和“rsync”有什么区别?

357

一篇关于在DigitalOcean上使用Nginx托管Ghost博客的文章中指出,要使用scp从本地计算机复制到远程服务器:

scp -r ghost-0.3 root@*your-server-ip*:~/

然而,Railscast 339: Chef Solo Basics 使用 scp 来实现相反的方向(从远程服务器到本地机器)的复制:

scp -r root@178.xxx.xxx.xxx:/var/chef .
在同一期Railscast中,当作者想要将文件复制到远程服务器(与第一个示例方向相同)时,他使用rsync
rsync -r . root@178.xxx.xxx.xxx:/var/chef

如果scp可以在双向复制,那为什么要使用rsync命令?scprsync有何不同之处?


1
除了更简单且始终加密之外,没有人指出scp比“rsync -aA”更好的地方。我更喜欢使用“rsync -aAX --delete source dest”。请查看bsync以进行双向同步。 - Tomachi
7个回答

515
这些工具的主要区别在于它们复制文件的方式。 scp 基本上读取源文件并将其写入目标文件。它执行一个简单的线性复制,本地或者通过网络。 rsync 也可以在本地或者通过网络复制文件。但是它采用了一种特殊的增量传输算法和一些优化来使操作更快。考虑这个调用。
rsync A host:B
  • rsync会检查AB的文件大小和修改时间戳,如果它们匹配,就会跳过任何进一步的处理。

  • 如果目标文件B已经存在,则增量传输算法将确保仅发送AB之间的差异。

  • rsync将数据写入临时文件T,然后用T替换目标文件B,以使更新对可能正在使用B的进程看起来是“原子”的。

它们之间的另一个区别涉及调用。 rsync有大量的命令行选项,允许用户微调其行为。它支持复杂的过滤规则,批处理模式,守护程序模式等。 scp只有几个开关。

总之,对于您的日常任务,请使用scp。您偶尔在交互式shell中输入的命令。它更简单易用,在这些情况下,rsync的优化帮助不大。

对于像 cron 作业这样的重复任务,请使用 rsync 。如上所述,在多次调用时,它将利用已传输的数据,执行非常快,并节省资源。它是在网络上保持两个目录同步的绝佳工具。
此外,在处理大文件时,请使用带有 -P 选项的 rsync 。如果传输中断,您可以通过重新发出命令来恢复它停止的位置。请参阅Sid Kshatriya的answer
最后,请注意协议类似于普通HTTP:未加密且没有完整性检查。除非您真的知道自己在做什么,请始终通过SSH(如上面问题中的示例)而不是通过rsync协议使用 rsync 。scp将始终使用SSH作为底层传输机制,具有完整性和机密性保证,因此这是两个实用程序之间的另一个区别。

29
您说您的日常任务使用 scp。根据您的说明和原帖,似乎在没有选项的情况下使用这两个工具的界面是相同的。如果 rsync 有更优越的实现且接口相同,为什么不总是使用 rsync? - Alex
16
即使没有选项,它们的界面也不相同。Rsync对源参数末尾斜杠的解释有所不同(同步目录本身与其内容)。它可能还有其他需要注意的地方,但我不确定。 - Rafa Viotti
10
我猜scp更有可能在类Unix系统上可用,这样你就可以避免偶尔出现的"命令未找到"错误。 - Rafa Viotti
rsync如何处理在传输过程中被杀死或者网络中断的情况?我经常看到人们使用scp+mv+traps来确保在出现错误时也能表现良好。如果rsync能够很好地处理这些情况,即使它有一些额外开销,它可能是更好的日常工具,对吧? - erikbstack
3
rsync 命令带有 -P 标志,可显示进度条并启用从部分完成的传输中恢复。详情请见 https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps - Ben
3
scprsync 之间的另一个接口区别在于如何保留修改时间和权限:rsync -a 相当于 scp -rp - Rafa Viotti

105

rysnc 可以在慢速或者不稳定的网络连接下使用。所以,如果你下载一个大文件中途中止了,那么当再次调用 rysnc 时,它将能够从离开时的位置继续。

使用 rsync -vP username@host:/path/to/file .

-P 选项可以保留部分下载的文件,并显示进度条。

如常查看 man rsync


69

scp和rsync在不同参数上的差异:

1. 延迟下的性能

  • scp :相对于rsync,scp的优化和速度较低。

  • rsync :相对于scp,rsync更加优化和快速。

https://www.disk91.com/2014/technology/networks/compare-performance-of-different-file-transfer-protocol-over-latency/

2. 中断处理

  • scp :scp命令行工具无法从断开的网络连接中恢复中止的下载。

  • rsync :如果上述rsync会话本身被中断,您可以通过键入相同的命令来多次恢复它。rsync会自动重新启动传输。

http://ask.xmodulo.com/resume-large-scp-file-transfer-linux.html

3. 命令示例

scp

$ scp source_file_path destination_file_path

rsync

$ cd /path/to/directory/of/partially_downloaded_file
$ rsync -P --rsh=ssh userid@remotehost.com:bigdata.tgz ./bigdata.tgz 

-P选项等同于--partial --progress,使rsync能够处理部分下载的文件。 --rsh=ssh选项告诉rsync使用ssh作为远程shell。

4. 安全性:

scp更安全。您必须使用rsync --rsh=ssh才能使其与scp一样安全。

请参阅man文档以了解更多信息:

性能图表


在许多系统中,默认情况下使用ssh。https://serverfault.com/questions/378939/do-you-need-e-ssh-for-rsync - qwr
17
关于安全性,来自openSSH 8.0发行说明scp协议已经过时、不灵活且难以修复。我们建议使用更现代的协议,如sftp和rsync来进行文件传输。 - downtheroad

18

rsync 相较于 scp(除了使用 ssh 进行传输时的增量算法和加密)的一个主要特点是,它会自动验证传输的文件是否正确,而 scp 不会这样做,这有时可能导致传输大文件时出现损坏。因此,总体来说,rsync 是具有保证的复制

CentOS 的 man 手册在 --checksum 选项说明的末尾提到了这一点:

  

请注意,rsync 总是通过检查在文件传输时生成的整个文件校验和来验证每个传输的文件是否在接收端正确重构,但这种自动传输后验证与此选项之前的“此文件需要更新吗?”检查无关。


5

对我来说,scp 始终使用 ssh (secure shell) 进行加密,而 rsync 并不一定加密。更具体地说,rsync 本身不执行任何加密;它仍然可以使用其他机制(例如,ssh)来进行加密。

除了安全性外,加密还对传输速度和 CPU 开销产生重大影响。(我的经验是,rsync 可能比 scp 快得多。)

查看此文章获取有关 rsync 加密的信息。


3

SCP最适合传输单个文件。
或者对于小型数据集,如具有小资源(例如:图像、SQLite等)的源代码树,可以结合使用tar和压缩。


然而,当您开始处理更大的数据量时,比如:

  • 媒体文件夹(40 GB)
  • 数据库备份(28 GB)
  • MP3库(100 GB)

此时使用SCP构建一个zip/tar.gz文件进行传输变得不可行,因为托管服务器的物理限制。

作为一种练习,您可以进行一些技巧性操作,例如将tar导入ssh并将结果重定向到远程文件中。(避免了需要构建交换或临时克隆的ziptar.gz

但是

Rsync简化了这个过程,并允许您在不消耗任何额外磁盘空间的情况下传输数据

另外

与完整克隆副本相比,连续(cron?)更新使用最小更改可以加速大型数据迁移。

tl;dr
scp == 小规模(在同一驱动器上具有构建压缩文件的空间)
rsync == 大规模(需要备份大型数据且没有剩余空间)


-3

最好从实际情况出发思考。在我们的团队中,我们使用rsync -aP来替换集群中的坏Cassandra主机。我们无法使用scp(速度慢且没有进度保留)来完成此操作。


其实这并没有提供其他答案中尚未提到的任何内容。此外,我们甚至不应该回答与主题无关的问题。 - Dan Cornilescu
1
@DanCornilescu 这描述了一个真实场景中的用例,这使得其他人能够理解其中的区别。我没有看到任何其他类似的答案。 - del bao
3
查看Sid和Rafa的回答中关于-P的解释以及与速度相关的注意事项。 - Dan Cornilescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接