“scp”和“rsync”有什么不同?

有关设置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 

为什么使用rsync命令如果scp将双向复制? scprsync什么不同?

这些工具之间的主要区别是如何复制文件。

scp基本上读取源文件并将其写入目标。 它在本地或通过networking执行简单的线性复制。

rsync也可以在本地或通过networking复制文件。 但它采用了特殊的delta转换algorithm和一些优化,使操作更快。 考虑这个电话。

 rsync A host:B 
  • rsync将检查AB的文件大小和修改时间戳,如果匹配,则跳过任何进一步的处理。

  • 如果目标文件B已经存在,增量转换algorithm将确保只有AB之间差异通过线路发送。

  • rsync会将数据写入临时文件T ,然后用Treplace目标文件B ,以使更新对于可能正在使用B的进程显得“primefaces”。

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

总之,使用scp来进行日常任务。 您在交互式shell中稍后键入一次的命令。 使用起来更简单,在这种情况下, rsync优化不会有太大帮助。

对于定期任务,如cron作业,请使用rsync 。 如上所述,在多次调用中,它将利用已经传输的数据,快速执行并节省资源。 这是一个很好的工具来保持两个目录在networking上同步。

另外,在处理大文件时,使用rsync-P选项。 如果传输中断,您可以通过重新发出命令将其恢复到停止位置。 见Sid Kshatriya的答案 。

rysnc可以在缓慢和不可靠的连接上运行。 因此,如果您的下载在大文件中间中止,那么再次调用时,rysnc将能够从停止的地方继续。

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

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

像往常一样检查man rsync

对我来说有一个区别是scp总是用ssh(安全shell)encryption,而rsync不一定是encryption的。 更具体地说, rsync本身不执行任何encryption。 它仍然能够使用其他机制(例如ssh)来执行encryption。

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

看看这个post ,当rsyncencryption上。

最好是在实际的环境下思考。 在我们的团队中,我们使用rsync -aPreplace集群中的一个糟糕的cassandra主机。 我们不能用scp来做这个(缓慢且没有进度保存)。

rsync(除deltaalgorithm之外)的一个主要function是自动validation传输的文件是否已正确传输。 Scp不会这样做,当传输更大的文件时偶尔会导致损坏。 所以一般来说rsync是一个有保证的副本。

--checksum选项结尾处,请参阅(centos)手册页说明:

请注意,rsync通过检查在传输文件时生成的整个文件校验和来validation每个传输的文件是否在接收端正确重build,但是自动传输后validation与该选项的before-传送“这个文件是否需要更新?”检查。