本文将为熟悉scp的任何人提供介绍和过渡指南,让我们跳到最常见的情况:复制文件和复制目录。OpenSSH项目指出,他们认为scp协议已过时,不灵活且不容易修复,然后,他们继续建议使用sftp或rsync进行文件传输。但是,许多用户是在scp命令下长大的,因此对rsync并不熟悉。此外,rsync不仅可以复制文件,还可以做更多的事情,这可以给初学者带来复杂而又不透明的印象,参考:在Linux/Unix上安装rsync并通过示例的方式介绍使用rsync命令。
复制文件 对于复制单个文件,scp和rsync命令实际上等效,假设您需要将foo.txt发送到名为server的服务器上的主目录中: $ scp foo.txt me@server:/home/me/ 等效的rsync命令仅要求您键入rsync,而不是scp: $ rsync foo.txt me@server:/home/me/
复制目录 对于复制目录,事情确实相去甚远,并且解释了为什么rsync被认为比scp更复杂,如果要将目录栏复制到服务器,则除了指定ssh信息外,相应的scp命令看起来与cp命令完全相同: $ scp -r bar/ me@server:/home/me/ 使用rsync,它是一个更强大的工具,因此需要考虑更多因素,首先,让我们看一下最简单的形式: $ rsync -r bar/ me@server:/home/me/ 看起来很简单吧?对于仅包含目录和常规文件的目录的简单情况,这将起作用。但是,rsync非常关心发送与主机系统上的文件完全相同的文件,让我们创建一个稍微复杂但并非罕见的示例: # 创建一个多级目录结构 $ mkdir -p bar/baz # 在根目录下创建一个文件 $ touch bar/foo.txt # 现在创建一个指向该文件的符号链接 $ cd bar/baz $ ln -s ../foo.txt link.txt # 返回我们的原始位置 $ cd - 现在,我们有了一个目录树,如下所示:
如果我们尝试从上方使用命令复制栏,我们会注意到结果截然不同,首先,让我们去scp: $ scp -r bar/ me@server:/home/me/ 如果您使用SSH服务器,并查看bar的目录树,则会发现与主机系统有一个重要而细微的区别:
请注意,link.txt不再是符号链接,现在,它是foo.txt的完整副本。如果您习惯使用cp,这可能是令人惊讶的行为,如果确实尝试使用cp -r复制bar目录,则将获得一个新目录,其中包含bar具有的确切符号链接。现在,如果我们尝试使用与之前相同的rsync命令,则会收到警告: $ rsync -r bar/ me@server:/home/me/ skipping non-regular file "bar/baz/link.txt" Rsync已警告我们,它发现了一个非常规文件并正在跳过它,因为您没有告诉它复制符号链接,所以它会忽略它们。Rsync有一个广泛的手册部分,标题为“SYMBOLIC LINKS”,其中介绍了所有可用的行为选项,对于我们的示例,我们需要添加–links标志: $ rsync -r --links bar/ me@server:/home/me/ 在远程服务器上,我们看到符号链接被复制为符号链接,请注意,这与scp复制符号链接的方式不同:
要保存某些键入内容并利用更多文件保留选项,请在复制目录时使用–archive(简称-a)标志,存档标志将实现大多数人期望的功能,因为它启用了递归复制,符号链接复制和许多其他选项: $ rsync -a bar/ me@server:/home/me/
注意事项 使用rsync有一个警告,使用scp指定非标准ssh端口比使用rsync容易得多。例如,如果服务器使用端口8022 SSH连接,则这些命令将如下所示: $ scp -P 8022 foo.txt me@server:/home/me/ 使用rsync,您必须指定要使用的“remote shell”命令,默认为ssh,您可以使用-e标志来实现: $ rsync -e 'ssh -p 8022' foo.txt me@server:/home/me/ Rsync确实使用了您的ssh配置,因此,如果您经常连接到该服务器,则可以将以下代码段添加到~/.ssh/config文件中,然后,您不再需要为rsync或ssh命令指定端口: Host server Port 8022 如果您连接的每个服务器都在相同的非标准端口上运行,则可以配置RSYNC_RSH环境变量。
为什么还要切换到rsync? 现在,我们已经介绍了从scp切换到rsync的日常用例和注意事项,让我们花一些时间来探究为什么您可能想根据自身的优点使用rsync,仅凭这些优点,许多人就在很久以前就切换到了rsync。 优点一: 如果您与服务器之间的网络连接速度较慢或受到限制,则rsync可以花费更多的CPU周期来节省网络带宽,它通过在发送数据之前压缩数据来实现此目的,可以使用-z标志启用压缩。 优点二: 如果目标文件与源文件不同,Rsync也仅复制文件,这通过目录递归工作。例如,如果您以上面的最后一个bar示例为例,并多次重新运行了rsync命令,则在初始传输后它将不起作用。如果您知道要重复使用它们,那么即使对本地副本也使用rsync是值得的,例如,仅针对此功能重复备份(例如备份到USB驱动器),因为它可以节省大量数据集的时间。 优点三: rsync可以做的不仅仅是复制数据,到目前为止,我们仅演示了如何使用rsync复制文件。如果您想让rsync使目标目录看起来像您的源目录,则可以将–delete标志添加到rsync,使用delete标志可以使rsync从源目录复制目标目录中不存在的文件,然后它将删除目标目录中源目录中不存在的文件,结果是目标目录与源目录相同。相比之下,scp只会将文件添加到目标目录。
结论 对于简单的用例,rsync并不比古老的scp工具复杂得多,唯一的显着区别是使用-a,而不是-r递归复制目录。但是,正如我们看到的,rsync的-a标志的行为更像cp的-r标志,而不是scp的-r标志。 最后,希望通过这些新命令,您可以加快文件传输工作流程。
相关主题 |