scp 用户的 rsync 迁移指南
创始人
2024-03-02 05:45:55
0

SSH 8.0 预发布公告中,OpenSSH 项目表示,他们认为 scp 协议已经过时,不灵活,而且不容易修复,然后他们继而推荐使用 sftprsync 来进行文件传输。

然而,很多用户都是从小用着 scp 命令长大的,所以对 rsync 并不熟悉。此外,rsync 可以做的事情也远不止复制文件,这可能会给菜鸟们留下复杂和难以掌握的印象。尤其是,scp 命令的标志大体上可以直接对应到 cp 命令的标志,而 rsync 命令的标志却和它大相径庭。

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

复制文件

对于复制单个文件而言,scprsync 命令实际上是等价的。比方说,你需要把 foo.txt 传到你在名为 server 的服务器上的主目录下:

$ scp foo.txt me@server:/home/me/

相应的 rsync 命令只需要输入 rsync 取代 scp

$ rsync foo.txt me@server:/home/me/

复制目录

对于复制目录,就有了很大的分歧,这也解释了为什么 rsync 会被认为比 scp 更复杂。如果你想把 bar 目录复制到 server 服务器上,除了指定 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 -

现在我们有了一个如下的目录树:

bar
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files

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

$ scp -r bar/ me@server:/home/me/

如果你 ssh 进入你的服务器,看看 bar 的目录树,你会发现它和你的主机系统有一个重要而微妙的区别:

bar
├── baz
│   └── link.txt
└── foo.txt

1 directory, 2 files

请注意,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 在手册中有一节“符号链接”,解释了所有可能的行为选项。在我们的例子中,我们需要添加 -links 标志:

$ rsync -r --links bar/ me@server:/home/me/

在远程服务器上,我们看到这个符号链接是作为一个符号链接复制过来的。请注意,这与 scp 复制符号链接的方式不同。

bar/
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files

为了省去一些打字工作,并利用更多的文件保护选项,在复制目录时可以使用归档标志 -archive(简称 -a)。该归档标志将做大多数人所期望的事情,因为它可以实现递归复制、符号链接复制和许多其他选项。

$ rsync -a bar/ me@server:/home/me/

如果你感兴趣的话,rsync 手册页有关于存档标志的深入解释。

注意事项

不过,使用 rsync 有一个注意事项。使用 scp 比使用 rsync 更容易指定一个非标准的 ssh 端口。例如,如果 server 使用 8022 端口的 SSH 连接,那么这些命令就会像这样:

$ scp -P 8022 foo.txt me@server:/home/me/

而在使用 rsync 时,你必须指定要使用的“远程 shell”命令,默认是 ssh。你可以使用 -e 标志来指定。

$ rsync -e 'ssh -p 8022' foo.txt me@server:/home/me/

rsync 会使用你的 ssh 配置;但是,如果你经常连接到这个服务器,你可以在你的 ~/.ssh/config 文件中添加以下代码。这样你就不需要再为 rsyncssh 命令指定端口了!

Host server
    Port 8022

另外,如果你连接的每一台服务器都在同一个非标准端口上运行,你还可以配置 RSYNC_RSH 环境变量。

为什么你还是应该切换到 rsync?

现在我们已经介绍了从 scp 切换到 rsync 的日常使用案例和注意事项,让我们花一些时间来探讨一下为什么你可能想要使用 rsync 的优点。很多人在很久以前就已经开始使用 rsync 了,就是因为这些优点。

即时压缩

如果你和服务器之间的网络连接速度较慢或有限,rsync 可以花费更多的 CPU 处理能力来节省网络带宽。它通过在发送数据之前对数据进行即时压缩来实现。压缩可以用 -z 标志来启用。

差量传输

rsync 也只在目标文件与源文件不同的情况下复制文件。这可以在目录中递归地工作。例如,如果你拿我们上面的最后一个 bar 的例子,并多次重新运行那个 rsync 命令,那么在最初的传输之后就不会有任何传输。如果你知道你会重复使用这些命令,例如备份到 U 盘,那么使用 rsync 即使是进行本地复制也是值得的,因为这个功能可以节省处理大型数据集的大量的时间。

同步

顾名思义,rsync 可以做的不仅仅是复制数据。到目前为止,我们只演示了如何使用 rsync 复制文件。如果你想让 rsync 把目标目录变成源目录的样子,你可以在 rsync 中添加删除标志 -delete。这个删除标志使得 rsync 将从源目录中复制不存在于目标目录中的文件,然后它将删除目标目录中不存在于源目录中的文件。结果就是目标目录和源目录完全一样。相比之下,scp 只会在目标目录下添加文件。

结论

对于简单的使用情况,rsync 并不比老牌的 scp 工具复杂多少。唯一显著的区别是在递归复制目录时使用 -a 而不是 -r。然而,正如我们看到的,rsync-a 标志比 scp-r 标志更像 cp-r 标志。

希望通过这些新命令,你可以加快你的文件传输工作流程。


via: https://fedoramagazine.org/scp-users-migration-guide-to-rsync/

作者:chasinglogic 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

在CentOS上实现远程文...
CentOS系统中远程拷贝的实用技巧与操作指南 在服务器管理与运维...
2025-03-26 08:49:54
不要使用WinSCP将整个...
可以使用以下代码示例来实现只将本地文件夹中的文件传输到远程目录:o...
2025-01-10 22:02:14
不同服务器之间互传scp
在日常的服务器管理中,我们经常需要在不同的服务器之间进行文件传输,...
2025-01-09 01:30:41
不能使用scp命令将文件复...
要解决这个问题,你可以使用rsync命令代替scp命令来复制文件给...
2024-12-27 07:01:03
不假设对AWS管理账户的情...
在AWS帐户中,管理策略以组织控制策略(SCP)的形式提供。下面是...
2024-12-25 20:01:06
不假定AWS管理帐户的情况...
要在不假定AWS管理帐户的情况下描述AWS帐户的SCP,可以使用A...
2024-12-25 17:00:41

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...