SCP用户到rsync的迁移指南

2020-07-22 17:50:38

作为8.0预发布声明的一部分,OpenSSH项目声明他们认为SCP协议过时、不灵活,而且不容易修复。然后,他们继续推荐使用sftp或rsync进行文件传输。

然而,许多用户是在scp命令下长大的,因此不熟悉rsync。此外,rsync可以做的不仅仅是复制文件,这会给初学者留下复杂和不透明的印象。特别是当SCP标志广泛地直接映射到CP标志而RSYNC标志不直接映射到CP标志时。

本文将为熟悉SCP的任何人提供介绍和过渡指南。让我们跳到最常见的场景:复制文件和复制目录。

对于复制单个文件,scp和rsync命令实际上是等效的。假设您需要将foo.txt发送到名为server的服务器上的主目录。

对于复制目录,情况确实有很大不同,这可能解释了为什么rsync被视为比scp更复杂。如果要将目录栏复制到服务器,则除了指定ssh信息外,对应的scp命令看起来与cp命令完全相同:

使用rsync时,需要考虑的事项更多,因为它是一个功能更强大的工具。首先,让我们看一下最简单的形式:

看起来很简单,对吧?对于只包含目录和常规文件的目录的简单情况,这是可行的。但是,rsync非常关心发送与主机系统上的文件完全相同的文件。让我们创建一个稍微复杂但并不少见的示例。

#创建多级目录结构$mkdir-p bar/baz#在根目录$touch bar/foo.txt创建文件#现在创建一个符号链接,该符号链接指向此文件$cd bar/baz$ln-s../foo.txt link.txt#返回到原始位置$cd-

Bar├──baz│和└──link.txt->;../foo.txt└──foo.txt1个目录,2个文件。

如果我们尝试上面的命令来复制栏,我们会注意到非常不同(并且令人惊讶)的结果。首先,让我们试一试SCP:

如果您通过ssh进入服务器并查看BAR的目录树,您将注意到与您的主机系统有一个重要而细微的不同:

Bar├──baz│└──Link.txt└──foo.txt1个目录,2个文件。

请注意,link.txt不再是符号链接。它现在是foo.txt的完整副本。如果你习惯了cp,这可能是令人惊讶的行为。如果您确实尝试使用cp-r复制bar目录,您将得到一个新目录,其中包含bar拥有的完全相同的符号链接。现在,如果我们尝试与之前相同的rsync命令,我们将收到一条警告:

Rsync已警告我们,它发现了非常规文件,正在跳过该文件。因为您没有告诉它复制符号链接,所以它忽略了它们。Rsync有一个详细的手册部分,标题为“符号链接”,它解释了您可以使用的所有可能的行为选项。对于我们的示例,我们需要添加-links标志。

在远程服务器上,我们看到符号链接被复制为符号链接。请注意,这与SCP复制符号链接的方式不同。

Bar/├──baz│└──Link.txt->;../foo.txt└──foo.txt1个目录,2个文件

为了节省一些输入并利用更多的文件保存选项,在复制目录时使用-archive(缩写为-a)标志。存档标志将实现大多数人预期的功能,因为它支持递归复制、符号链接复制和许多其他选项。

如果您感兴趣,rsync手册页有关于存档标志启用功能的详细说明。

但是,使用rsync有一个警告。使用scp指定非标准ssh端口比使用rsync容易得多。例如,如果服务器使用端口8022 SSH连接,则这些命令将如下所示:

使用rsync时,您必须指定要使用的“远程shell”命令。此默认值为ssh。您可以使用-e标志来执行此操作。

Rsync确实使用您的ssh配置;但是,如果您经常连接到此服务器,则可以将以下代码片段添加到您的~/.ssh/config文件中。这样您就不再需要为rsync或ssh命令指定端口了!

或者,如果您连接到的每个服务器都在相同的非标准端口上运行,则可以配置rsync_rsh环境变量。

既然我们已经介绍了从SCP切换到rsync的日常用例和注意事项,让我们花一些时间来探索为什么您可能想要根据rsync本身的优点来使用rsync。很多人早在很久以前就仅仅因为这些优点就转向了rsync。

如果您与服务器之间的网络连接速度较慢或有限,则rsync可以花费更多的CPU周期来节省网络带宽。它通过在发送数据之前压缩数据来实现这一点。可以使用-z标志启用压缩。

仅当目标文件不同于源文件时,rsync才会复制文件。这通过目录递归地工作。例如,如果您以上面最后一个bar示例为例,并多次重新运行rsync命令,则在初始传输之后它将不起任何作用。如果您知道将重复使用rsync(例如备份到USB驱动器),那么使用rsync即使是用于本地副本也是值得的,因为对于大型数据集,使用rsync可以节省大量时间。

顾名思义,rsync可以做的不仅仅是复制数据。到目前为止,我们只演示了如何使用rsync复制文件。如果您希望rsync使目标目录看起来像您的源目录,则可以向rsync添加-delete标志。DELETE标志使其成为rsync,以便rsync从源目录复制目标目录上不存在的文件。然后,它将删除源目录中不存在的目标目录上的文件。结果是目标目录与源目录相同。相比之下,SCP只会将文件添加到目标目录。

对于简单的用例,rsync并不比历史悠久的SCP工具复杂。唯一显著的区别是使用-a而不是-r递归复制目录。但是,正如我们看到的,rsync的-a标志的行为更像cp的-r标志,而不是scp的-r标志。