一篇关于 setting up Ghost blogging 的文章说使用 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
命令? scp
与 rsync
有何不同?
这些工具之间的主要区别在于它们复制文件的方式。
scp
基本上读取源文件并将其写入目标。它在本地或通过网络执行纯线性复制。
rsync
还可以在本地或通过网络复制文件。但它采用了一个特殊的 delta transfer algorithm 和一些优化来使操作更快。考虑电话。
rsync A host:B
rsync 将检查 A 和 B 的文件大小和修改时间戳,如果它们匹配,则跳过任何进一步的处理。
如果目标文件 B 已经存在,则增量传输算法将确保仅通过线路发送 A 和 B 之间的差异。
rsync 会将数据写入临时文件 T,然后将目标文件 B 替换为 T,以使更新对于可能正在使用 B 的进程看起来是“原子的”。
它们之间的另一个区别涉及调用。 rsync
有大量命令行选项,允许用户微调其行为。它支持复杂的过滤规则,以批处理模式、守护进程模式等运行。scp
只有几个开关。
总之,将 scp
用于您的日常任务。您偶尔在交互式 shell 上键入的命令。它使用起来更简单,在这些情况下,rsync
优化不会有太大帮助。
对于重复任务,例如 cron
作业,请使用 rsync
。如前所述,在多次调用时,它将利用已传输的数据,非常快速地执行并节省资源。它是通过网络保持两个目录同步的绝佳工具。
此外,在处理大文件时,请将 rsync
与 -P
选项一起使用。如果传输中断,您可以通过重新发出命令从停止的位置恢复传输。见席德·刹帝利的answer。
最后,请注意 rsync://
该协议类似于纯 HTTP:未加密且没有完整性检查。请务必始终通过 SSH 使用 rsync
(如上述问题中的示例),而不是通过 rsync 协议,除非您真的知道自己在做什么。 scp
将始终使用 SSH 作为具有完整性和机密性保证的底层传输机制,因此这是两个实用程序之间的另一个区别。
rysnc 对于在慢速和不可靠的连接上运行很有用。因此,如果您的下载在一个大文件的中间中止,rysnc 将能够在再次调用时从它停止的地方继续。
使用rsync -vP username@host:/path/to/file .
-P 选项保留部分下载的文件并显示进度。
像往常一样检查man rsync
不同参数上的差异 b/w scp 和 rsync
1. 性能优于延迟
scp : scp 的优化和速度相对较少
rsync : rsync 相对更优化和速度
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 文档以了解更多信息:
SCP:http://www.manpagez.com/man/1/scp/
rsync:http://www.manpagez.com/man/1/rsync/
https://i.stack.imgur.com/aU9qo.jpg
The scp protocol is outdated, inflexible and not readily fixed. We recommend the use of more modern protocols like sftp and rsync for file transfer instead.
rsync
优于 scp
的一个主要特性(除了 delta 算法和加密,如果使用 w/ssh)是它自动验证传输的文件是否已正确传输。 scp 不会这样做,这有时可能会在传输较大的文件时导致损坏。所以总的来说rsync 是有保证的副本。
Centos 手册页在 --checksum
选项描述的结尾提到了这一点:
请注意,rsync 始终通过检查在传输文件时生成的整个文件校验和来验证每个传输的文件是否在接收端正确重建,但是自动传输后验证与此选项的 before- the-transfer “这个文件需要更新吗?”查看。
对我来说有一个区别,scp
始终使用 ssh(安全 shell)加密,而 rsync
不一定加密。更具体地说,rsync
本身不执行任何加密;它仍然能够使用其他机制(例如 ssh)来执行加密。
除了安全性之外,加密还对您的传输速度以及 CPU 开销产生重大影响。 (我的经验是 rsync
可能比 scp
快得多。)
查看此 post,了解 rsync
何时启用加密。
scp 最适合 一个 文件。
或 tar
和压缩较小的数据集,例如资源较少的源代码树(ie:图像、sqlite etc)。
然而
较大
媒体文件夹 (40 GB)
数据库备份 (28 GB)
mp3 库 (100 GB)
此时构建一个 zip/tar.gz 文件以使用 scp 传输变得不切实际,这会受到托管服务器的物理限制。
作为练习,您可以做一些 体操,例如将 tar
导入 ssh
并将结果重定向到 remote 文件。 (无需构建交换或临时克隆 aka zip 或 tar.gz)
然而,
rsync 简化了这个过程,允许您在不消耗任何额外磁盘空间的情况下传输数据。
还,
连续(cron?)更新使用最少的更改,而完整的克隆副本随着时间的推移加速了大型数据迁移。
tl;dr
scp
== 小规模(有空间在同一驱动器上构建压缩文件)
rsync
== 大规模(需要备份大量数据且没有剩余空间)
最好在实际情况下思考。在我们的团队中,我们使用 rsync -aP
来替换集群中的错误 cassandra 主机。我们不能用 scp 做到这一点(缓慢且没有进度保存)。
scp
更有可能在类 Unix 系统上可用,因此您可以防止不时出现烦人的“找不到命令”。scp
和rsync
之间的另一个界面区别:rsync -a
与scp -rp
以保留修改时间和权限。