在SSH8.0预发布公告中,OpenSSH项目表示他们认为scp协议已过时,不灵活且不易修复,然后他们继续推荐sftp或rsync用于文件传输。但是很多用户都是使用scp命令长大的,所以对rsync并不熟悉。此外,rsync可以做的不仅仅是复制文件,这对于新手来说可能会显得复杂且难以掌握。特别是scp命令的flags可以大致直接对应cp命令的flags,而rsync命令的flags则与其有很大的不同。本文将为熟悉scp的人提供介绍和过渡指南。让我们进入最常见的场景:复制文件和复制目录。复制文件对于复制单个文件,scp和rsync命令实际上是等价的。例如,你需要将foo.txt传输到名为server的服务器上你的主目录:$scpfoo.txtme@server:/home/me/对应的rsync命令只需要输入rsync而不是scp:$rsyncfoo.txtme@server:/home/me/复制目录复制目录有很大的区别,这就解释了为什么rsync被认为比scp更复杂。如果要将bar目录复制到server服务器,除了指定ssh信息外,对应的scp命令与cp命令完全一样。$scp-rbar/me@server:/home/me/对于rsync,要考虑的因素很多,因为它是一个比较强大的工具。首先,让我们看一下最简单的形式:$rsync-rbar/me@server:/home/me/看起来很简单,对吧?对于只有目录和普通文件的简单情况,这很好。但是,rsync更关心的是按照主机系统上的原样发送文件。让我们创建一个稍微复杂但并不少见的示例:#创建一个多级目录结构$mkdir-pbar/baz#在其根目录创建一个文件$touchbar/foo.txt#现在创建一个符号链接指向文件$cdbar/baz$ln-s../foo.txtlink.txt#返回到原始位置$cd-现在我们有一个这样的目录树:bar├──baz│└──link.txt->../foo.txt└──foo.txt1目录,2个文件如果我们尝试使用上面的命令复制bar,我们会注意到非常不同(和令人惊讶)的结果。首先,让我们试试scp:$scp-rbar/me@server:/home/me/如果你ssh进入你的服务器并查看bar的目录树,你会发现它有一个重要而微妙的区别:bar├──baz│└──link.txt└──foo.txt1个目录,2个文件注意link.txt不再是符号链接,它现在是foo.txt的完整副本。如果您习惯使用cp,这可能是令人惊讶的行为。如果您尝试使用cp-r复制bar目录,您将获得一个与bar具有相同符号链接的新目录。现在如果我们尝试使用之前的rsync命令,我们会收到警告:$rsync-rbar/me@server:/home/me/skippingnon-regularfile"bar/baz/link.txt"rsync警告我们它found找到了一个不寻常的文件,正在跳过它。由于您没有告诉它可以复制符号链接,因此它忽略了它们。rsync在手册中有一个“符号链接”部分,解释了所有可能的行为选项。在我们的例子中,我们需要添加-links标志:$rsync-r--linksbar/me@server:/home/me/在远程服务器上,我们看到这个符号链接被复制为一个符号链接。请注意,这与scp复制符号链接的方式不同。bar/├──baz│└──link.txt->../foo.txt└──foo.txt1个目录,2个文件为了节省一些输入并利用更多的文件保护选项,复制目录存档标志-archive(简称-a)时可以使用。archive标志会做大多数人期望的事情,因为它支持递归复制、符号链接复制和许多其他选项。$rsync-abar/me@server:/home/me/如果您有兴趣,rsync手册页对归档标志有深入的解释。注意事项不过,使用rsync有一个注意事项。使用scp指定非标准ssh端口比使用rsync更容易。例如,如果服务器在端口8022上使用SSH连接,则命令如下所示:$scp-P8022foo.txtme@server:/home/me/使用rsync时,必须指定“远程shell”命令,默认是ssh。您可以使用-e标志来指定。$rsync-e'ssh-p8022'foo.txtme@server:/home/me/rsync将使用你的ssh配置;但是,如果您经常连接到此服务器,则可以将其添加到您的~/.ssh/配置文件中,添加以下代码。这样您就不需要再为rsync或ssh命令指定端口了!主机服务器端口8022或者,如果您连接的每个服务器都在同一个非标准端口上运行,您还可以配置RSYNC_RSH环境变量。为什么你仍然应该切换到rsync?现在我们已经介绍了从scp切换到rsync的日常用例和注意事项,让我们花点时间探讨一下您可能想要使用rsync的优势。由于这些优点,很多人很早以前就开始使用rsync。即时压缩如果您和服务器之间的网络连接速度慢或受限,rsync可以花费更多的CPU处理能力来节省网络带宽。它通过在发送数据之前即时压缩数据来实现这一点。可以使用-z标志启用压缩。如果目标文件与源文件不同,差异传输rsync也只复制文件。这在目录中递归工作。例如,如果您使用我们上面的最后一个条形图示例,并多次重新运行该rsync命令,则在最初的一个之后将不会有任何传输。如果您知道您将重复使用这些命令,例如备份到USB驱动器,那么即使在本地复制时也值得使用rsync,因为此功能可以在处理大型数据集时节省大量时间。同步顾名思义,rsync可以做的不仅仅是复制数据。到目前为止,我们只演示了如何使用rsync复制文件。如果想让rsync把目标目录改成源目录的样子,可以给rsync加上删除标志-delete。这个删除标志导致rsync从源目录复制目标目录中不存在的文件,然后它会删除目标目录中源目录中不存在的文件。结果是目标目录和源目录完全一样。相比之下,scp只会添加目标目录下的文件。结论对于简单的用例,rsync并不比旧的scp工具复杂多少。唯一显着的区别是递归复制目录时使用-a而不是-r。然而,正如我们所见,rsync的-a标志更像是cp的-r标志而不是scp的-r标志。希望通过这些新命令,您可以加快文件传输工作流程。
