Contents

通过SSH在Linux机器之间传输文件

1. 概述

有时我们希望将文件从一台 Linux 机器安全地传输到另一台。也许我们想将一些文件上传到生产服务器或进行备份。

在本文中,我们将了解通过ssh 在 Linux 机器之间传输文件的不同工具,ssh 是 Linux 机器之间最流行的远程连接协议。

我们将了解两种最流行的文件传输工具:scprsync

2. 基本工具使用

2.1. 一个简单的例子

假设我们要将文件text.log从本地系统复制到IP 地址为 111.111.111.111 的远程 Linux 服务器上的路径*/var/log* ,并且我们要使用 root 用户凭据。

这可以通过scprsync使用相同的基本语法来实现:

scp text.log root@111.111.111.111:/var/log
rsync text.log root@111.111.111.111:/var/log

在我们了解它们的变化和差异之前,让我们了解这些命令的共同点。

2.2. 一般语法

scprsync的一般语法是:

scp/rsync [OPTION] [user@][SRC_HOST:]Source_File [user@][DEST_HOST:]Destination_file

OPTION 部分允许我们使用命令行开关来修改复制操作的行为*。*源和目标的两个路径允许我们指定复制操作两侧的文件路径,以及要使用的用户帐户。

在上面的示例中,本地文件被复制到远程位置 — root@111.111.111.111 。正如我们稍后将看到的,我们可以使用远程格式来描述源或目标,从而允许这些命令将文件上传到服务器并从服务器下载文件。

2.3. 需要注意的重要事项

当我们使用任何工具通过 ssh 传输文件时,有几点需要记住:

  • 如果我们没有通过交换 RSA 密钥设置自动登录,则scp /rsync命令将要求用户密码登录到远程服务器
  • 我们不需要为我们的本地服务器提供我们的用户名或服务器 IP
  • 我们可以提供源/目标文件的绝对路径或相对路径,其中相对路径是相对于当前工作目录或远程用户的主目录

2.4. 指定文件名

在目标路径中提供文件名不是强制性的。如果我们不提供文件名,将使用源文件的名称。

在我们的第一个示例中,将在目标目录中创建名为text.log 的文件。如果我们希望文件以不同的名称存储,我们可以提供一个文件名作为目标路径的一部分。

使用隐式文件名,我们可以将文件从远程 Linux 服务器复制到当前目录,并保留其原始名称:

scp root@111.111.111.111:/var/log/text.log .
rsync root@111.111.111.111:/var/log/text.log .

在这里,“。” 参数代表当前工作目录。如果需要,我们还可以提供不同的路径:

scp root@111.111.111.111:/var/log/text.log /opt/path/mytextlog.log
rsync root@111.111.111.111:/var/log/text.log /opt/path/mytextlog.log

2.5. 在服务器之间复制

我们甚至可以使用这些工具在两个远程服务器之间进行复制。例如,让我们从服务器 111.111.111.111 复制text.log文件。到 root 用户的服务器 222.222.222.222:

scp root@111.111.111.111:/var/log/text.log root@222.222.222.222:/var/log
rsync root@111.111.111.111:/var/log/text.log root@222.222.222.222:/var/log

现在我们对scprsync有了基本的了解,让我们更深入地了解它们。

3. scp(安全拷贝)

scp 代表安全复制,用于通过 ssh 连接传输文件。它是一个原始副本,这意味着它只会从源文件夹中读取数据并将其写入目标文件夹。所以,如果我们正在寻找一个不会超过几分钟的快速副本,那么我们应该选择scp

如果我们要传输一个大文件,我们应该确保我们有一个稳定的互联网连接。由于scp不可恢复,如果在大传输期间连接断开,时间可能会丢失,并且必须重新启动整个复制操作。

3.1. 安装

大多数 Linux 发行版都预装了scp。我们可以很容易地检查是否安装了scp

which scp

如果已经安装,我们将看到scp命令的路径。空响应意味着未安装scp

如果我们还没有,那么要安装scp,我们需要从官方包存储库安装 OpenSSH 客户端包:

sudo apt-get install openssh-clients    # For Debian based systems like Ubuntu 
sudo yum install openssh-clients        # For Red Hat based systems like CentOS and Fedora

让我们来看看使用scp的几个常见场景。

3.2. 传输多个文件

我们可以提供一个以空格分隔的文件列表来传输多个文件:

scp text.log text1.log text2.log root@111.111.111.111:/var/log

我们还可以使用-r*选项递归地复制整个目录*。例如,要从*/home/app/log/*目录复制所有文件:

scp -r /home/app/log root@111.111.111.111:/var/log

我们可以使用 * 发送匹配特定命名模式的文件。例如,我们有四个文件text.log、text2.log、app.logapp2.log,我们只想发送以app开头的文件:

scp /home/app/log/app* root@111.111.111.111:/var/log

3.3. 使用身份文件传输文件

大多数 Linux 发行版都首选基于密钥的身份验证。在scp命令中,我们可以使用***-i*选项指定标识文件**:

scp -i key.pem text.log root@111.111.111.111:/var/log

许多系统管理员使用基于密钥的身份验证来传输文件,因为它不需要在每次传输时都提供用户凭据。

3.4. 即时压缩

我们可以通过使用带有*-C*选项的即时压缩来减少传输时间。这将分别在源路径和目标路径压缩和解压缩文件:

scp -C text.log root@111.111.111.111:/var/log

3.5. 传输期间限制带宽

我们可以使用*-l*选项以 Kbit/s 为单位指定带宽

scp -l 500 text.log root@111.111.111.111:/var/log

3.6. 调试的详细模式

我们可以使用*-v*选项启用详细模式

scp -v text.log root@111.111.111.111:/var/log

输出看起来像:

Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp 
OpenSSH_7.9p1, LibreSSL 2.7.3 
debug1: Reading configuration data /etc/ssh/ssh_config 
debug1: /etc/ssh/ssh_config line 48: Applying options for * 
debug1: Connecting to prod-reporting-b port 22. 
## debug1: Connection established. 
Transferred: sent 2856, received 2932 bytes, in 2.1 seconds 
Bytes per second: sent 1366.8, received 1403.1 
debug1: Exit status 0

详细(调试)输出打印scp正在执行的确切步骤,这对于调试连接、身份验证和配置问题很有用

4. *rsync *(远程同步)

*rsync *快速且用途广泛。它非常适合同步和巧妙地传输文件,因为它会跟踪已复制的数据量和剩余的数据量

当我们有大文件要传输时,我们应该使用rsync —— 即使出现网络连接问题,复制到该点的数据也不会丢失,当连接恢复时,复制将从该点恢复。

当我们必须多次传输同一个文件时,rsync比**scp命令更快,因为它使用远程更新协议,它只允许传输两组文件之间的差异。

4.1. 安装

让我们通过调用它来显示其版本来检查是否安装了rsync

rsync --version

如果出现错误,那么我们可以安装它:

sudo apt-get install rsync    # For Debian based systems like Ubuntu 
sudo yum install rsync        # For Red Hat based systems like CentOS and Fedora

让我们来看看可以使用rsync 的一些常见场景。

4.2. 试运行

由于rsync是如此强大,如果不检查它要做什么就使用它是很危险的。幸运的是,rsync提供了–dry-run选项,它可以在不实际传输文件的情况下执行试运行**:

rsync --dry-run text.log root@111.111.111.111:/var/log

4.3. 复制属性和元数据

rsync提供了*-a*选项,它复制符号链接、修改时间、组、所有权和权限以及文件内容。

另一个重要的选项是 -h *,*它将以人类可读的形式打印输出。这在与–dry-run选项一起运行时特别有用:

rsync -ah --dry-run text.log root@111.111.111.111:/var/log

4.4. 传输目录中的多个文件

我们可以提供一个以空格分隔的文件列表来传输多个文件:

rsync text.log text1.log text2.log root@111.111.111.111:/var/log

-r选项递归地复制目录中的所有文件:

rsync -r /home/app/log root@111.111.111.111:/var/log

** * 运算符发送与特定模式匹配的文件**:

rsync /home/app/log/app* root@111.111.111.111:/var/log

我们可以使用*–include选项和–exclude*选项从目录内的文件列表中**包含和排除文件。**例如,要发送目录中不包括以“ R ”开头的文件的所有文件:

rsync --include '*' --exclude 'R*' text.log root@111.111.111.111:/urs/log

4.5. 即时压缩

我们可以通过使用带有*-z*选项的即时压缩来减少传输时间。这将分别在源路径和目标路径压缩和解压缩文件:

rsync -z text.log root@111.111.111.111:/var/log

4.6. 传输前删除目标路径中的现有文件

** –delete选项在传输新文件之前从目的地删除现有文件**:

rsync --delete text.log root@111.111.111.111:/var/log

4.7. 传输后自动删除源文件

假设我们要将日志从生产服务器备份到备份服务器。在这种情况下,我们可能希望在将所有文件传输到我们的备份服务器后从生产服务器中删除文件。

rsync服务器提供了*–remove-source-files*选项来在传输完成后删除源文件

rsync --remove-source-files text.log root@111.111.111.111:/var/log

5.选择哪种工具?

我们可以使用这两种工具在 Linux 机器之间传输文件。但是,当文件较小时,我们应该考虑使用scp——它是一种简单的复制工具,而且应用广泛。在我们的日常使用中,scp是小型一次性传输的简单选择。

当文件很大或者当我们需要更复杂和高效的同步时,我们将从rsync中获益最多。它也是cron作业和脚本等重复性任务的更好选择。