SCP 命令在 Linux/Unix 中的用法及示例

2024 年 10 月 9 日 | 阅读 11 分钟

当我们处理任何具有存储容量的电子设备或计算机时,我们可能会通过多种方式共享或分发文件和信息。最基本共享的一些文件包括音频文件、PDF、视频、图像或其他格式的 Word 文档。

正在分发的信息可能是机密的或私有的,这意味着当我们谈论设备(如 appshare、xender,甚至有时是蓝牙使用)时,它仅供特定人群或特定个人使用。现在,当我们谈论系统时,情况也一样;我们有提供相同功能的软件和网站。

当我们谈论在 Linux 等操作系统中共享数据时,有很多命令可供选择来分发信息。另一方面,scp 命令使我们能够轻松安全地共享数据和文件。在当今的市场中,如果您是一名系统管理员,拥有 Linux 知识非常重要且有用。作为系统管理员,数据分发将是我们日常工作的一部分,我们需要分发的信息是安全的,我们可以使用 scp 命令来实现这一点。

SCP 命令简介

SCP 代表 安全复制协议。在 Linux 系统中,SCP 命令可以在多个服务器之间安全地复制文件。它允许在远程主机和本地主机之间或两个远程主机之间安全地传输文件。它应用与 SSH(安全外壳)协议相同的安全性和身份验证。SCP 命令以其预装可用性、安全性和简洁性而闻名。

安全复制协议是一个命令行实用程序,允许用户在两个不同位置(通常是 Linux 或 Unix 系统之间)安全地复制目录和文件。该协议保证文件传输是加密的,以防止任何有恶意意图的人窃取敏感信息。换句话说,我们可以说 SCP 命令是 copy (cp) 命令的替代品。

当然,这意味着有多个机器的参与才能使过程得以进行,因为我们正在讨论文件传输。SCP 是以相对较高的安全级别传输文件的方式。它允许用户在远程系统和本地服务器之间复制文件,而将原始文件保留在原处。scp 命令都可以下载和上传文件。此外,它允许用户复制整个文件目录。它甚至可以在多个远程系统之间复制文件。

我们可以在以下情况下使用 scp 命令:

  • 在两个远程服务器之间复制数据
  • 通过本地主机向远程主机复制数据
  • 在同一台机器上复制数据

在这里,讨论在使用 scp 命令之前我们需要准备一些东西会很有益。

  • 在服务器和客户端机器上都预装了 SSH。
  • 对服务器和客户端机器都有 sudo 访问权限。

scp 命令既指 scp Linux 实用程序,也指该协议。它取代了实际的 rcp 命令,而 rcp 命令不再被认为是安全的。它没有在 RFC 中描述,但几乎所有的 Linux 发行版都有定义如何使用的“man”页。例如,Ubuntu 包含一个 scp man 页。

在发送文件之前,客户端会与服务器建立 scp 连接。scp 命令借助 TCP(传输控制协议)的 22 端口进行连接。然后,远程服务器会调用 scp 进程。scp 命令可以在以下两种模式之一中实现:

  • 接收模式:它通过客户端接收文件并将其存储在指定的目录中。
  • 源模式:它通过文件系统访问所需的源文件,并将其发送回客户端。

作为基础层,scp 命令使用 SSH(安全外壳)协议。SSH 验证客户端并加密信息以进行传输。此外,scp 除了加密文件内容外,还会加密每个密码。由于文件已加密,因此无法通过中间人攻击访问它们。

此外,scp 还支持远程到远程模式。Scp 在源远程主机和目标远程主机之间建立了直接连接。它允许数据在两个不同的节点之间传递,而无需通过本地主机。在大多数最新版本中,数据默认会从原始节点路由。它更安全,但效率也较低。

scp 命令是为效率和速度而开发的。它被认为是一种简单、可靠且稳健的复制文件的方法。然而,它的性能非常普遍,一些安全分析师批评它有限且不灵活。例如,scp 命令无法正确地与集合 shell 配置文件交互。此外,SSH 配置文件消息可能导致连接失败和错误。scp 命令不允许用户重命名、列出或删除文件。一些专家建议使用 rsync 和 SFTP。

重要提示:没有任何单一协议可以完全被认为是完全安全的。在处理高度敏感数据之前,请咨询安全专家。

开始之前

对于数据传输,SCP 命令依赖于 ssh,因此需要密码或 ssh 密钥才能在远程系统上进行身份验证。在目标系统和源文件上,我们必须分别具有至少写权限和读权限才能复制文件。冒号是 SCP 命令区分远程和本地位置的方式。在复制具有相同位置和名称的文件时,我们需要小心,因为 SCP 命令会覆盖这些文件而不会发出任何警告。建议在发送大文件时,在 tmux 或 screen 会话中执行 SCP 命令。

SFTP 和 SCP 之间的区别

SFTP(SSH 文件传输协议)和 scp 命令是用于在不同系统之间安全复制文件的两种不同方法。这两种协议都有其优点。但是,在几乎所有情况下都可以选择任何一种。以下是这两种系统之间的一些区别和相似之处。

  • 与 FTP 等旧协议相比,SFTP(SSH 文件传输协议)和 scp 命令都被认为更安全。
  • 两种协议都使用 TCP 作为传输协议。默认情况下,这两种协议都使用 22 端口。
  • 两种协议都依赖于 SSH 公钥身份验证和加密。但是,scp 命令仅将 SSH 用作辅助层,而 SSH 文件传输协议是基于 SSH 的。与 scp 命令相比,SSH 与 SFTP 的集成更好。
  • scp 命令的旧版本存在一些安全漏洞。例如,攻击者可能会操纵 SCP 服务器。但是,新版本的 scp 命令已解决了这些问题。SFTP 从未出现过这些问题。
  • 通常,scp 命令比 SFTP 更快。它使用更有效的算法来发送文件。
  • scp 命令针对文件传输(一次性)进行了优化,并且可以很好地与 shell 脚本一起使用。
  • scp 命令在 Linux 上运行效果更好,而 SFTP 协议是 Windows 的基础。
  • scp 命令是非交互式的。但是,SFTP 允许交互式会话。此外,SFTP 允许用户恢复和暂停文件传输。
  • scp 命令包含额外的文件管理功能。它允许用户重命名、列出和删除文件。scp 命令是一种简单的协议,只能执行常见的文件传输。

重要提示: 源系统和目标系统可能需要 SSH 密钥进行验证。如果 scp 命令显示身份验证错误,请为源创建 SSH 密钥并将其发送到目标服务器。然后,尝试再次运行命令。源服务器和本地主机不需要 SSH 密钥(共享),可以使用密码进行验证。

SCP 用例

scp 命令是一个更简单的复制实用程序。它运行良好,并且能够快速传输文件。然而,它不提供多种选项,也不以交互模式运行。它也不提供管理工具,如删除文件和列出远程目录的功能。对于 scp 命令,主要用例是一次性传输,此时速度至关重要。对于更复杂的任务,它不太有用。在这种情况下,我们可以尝试 SFTP。

Linux 实用程序 scp 是经典应用程序(如 FTP)的更安全替代品。可以在远程服务器和本地主机之间或在两个不同的远程服务器之间复制多个文件。SSH 被 scp 协议用作加密和身份验证的基础层。SFTP 和 scp 协议是服务器之间文件传输的两种不同技术。scp 协议更简单、更快,而 SFTP 是一个功能更全面的协议,提供更多的管理选项和交互模式。

在 Linux 系统上,我们可以使用 scp 发送文件。scp 命令更易于使用,尽管它包含许多选项。首先应定义源文件的信息,然后定义目标目录的信息。应添加主机详细信息和用户名。可以同时发送两个或多个文件,并且可以递归复制目录。

SCP 命令选项

我们可以向任何 SCP 命令添加几个选项来加速和自定义过程。选项作为 scp 之后的元素包含。所有选项都有一个单字符的短格式和一个描述性的长格式。

选项描述
-1将使用协议 1。
-2将使用协议 2。
-4仅使用 IPv4 地址。
-6仅使用 IPv6 地址。
-B以批量模式执行,禁用所有用户输入查询。
-b (buffer_size)描述用于数据传输的缓冲区大小。如果未定义,则默认使用 -32768 字节。
-ccipher 选择数据加密过程的密码。如果未指定,SCP 应用默认的 'AnyStdCipher'。SCP 默认使用 'AES-128' 进行文件加密。如果我们希望修改密码,我们需要使用选项,即 -c,后跟密码名称。
-C启用压缩。使用此选项进行复制时,将激活压缩并提高传输速度。它将在源上自动激活压缩,并在目标上激活解压缩。
-D (debug_level)调试级别设置(1、2、3 或 99)
-d仅当目标目录已存在时,才复制文件。
-F file对于 SSH,描述一个备用配置文件。在需要使用区域网络连接到 Linux 系统进行复制的情况下,它使用不同的 ssh_config 文件。在这种情况下,我们需要为每个用户分配另一个 SSH 配置文件。
-h显示命令选项列表。
-i file指示用于读取公钥身份验证状态的文件。这里,i 代表私钥或身份文件。在 Linux 环境中通常选择基于密钥的身份验证。因此,我们可以使用 -i 选项特别指定身份文件或私钥文件。
-o ssh_option以 ssh_configure 格式为 SSH 设置选项。
-l limit限制带宽(以 Kbit/s 为单位定义限制)
-p此选项用于在复制时保留文件权限、访问时间和修改时间。
-P port定义要连接的端口。如果未定义,SCP 使用端口 22。如果目标主机的端口号与默认端口号 22 不同,我们需要使用 -P 选项特别指定端口号。
-q以安静模式执行 SCP。此选项将关闭进程监视器,并且不会在终端窗口上显示传输过程、诊断或 ssh 的警告消息。
-Q禁用显示文件传输统计信息。
-S program为加密连接应用指定的函数。
-r此选项将递归复制目录和文件。例如,如果我们要将整个文件夹(及其内容)复制到目标机器,我们需要执行 -r 选项。
-v启用详细模式,将调试级别设置为 2。它将在终端窗口上逐步显示 SCP 命令的执行过程。这对于调试很有用。
-u复制完成后删除源文件。

SCP 命令语法

Linux 实用程序 scp 在 Linux 系统上基于 SCP 工作。通常,它是 SSH 包的一部分,并且几乎所有发行版都已安装。这种语法不像乍一看那么复杂。经典的 scp 命令包含以下组件:

  • 命令关键字,即 scp。
  • 一个或多个选项。
  • 源文件路径。必须为远程源文件定义主机标识符和远程用户帐户。
  • 目标目录的位置。对于远程目标,需要服务器 IP/名称和用户名。

在使用 SCP 命令之前,让我们从常用语法开始。

SCP 命令的语法形式如下:

其中,

  • 选项:它指定 SCP 选项,如递归复制、限制、ssh 端口、ssh 配置、密码等。
  • [user@]SRC_HOST: ]file1: 这是源文件。
  • [user@]DEST_HOST: ]file2: 这是目标文件。

本地文件必须使用相对或绝对路径指定,而远程文件名必须包含主机和用户规范。

SCP 示例

使用 SCP 在两个不同的系统之间复制目录和文件

使用 SCP 命令复制本地文件

我们需要执行以下命令将任何文件从本地系统复制到远程系统:

其中 **empty.txt** 是我们要复制的文件名,**remote_username** 是远程服务器用户,**10.10.0.2** 是服务器的 IP 地址。**/remote/directory** 是我们要将文件复制到的目录路径。如果我们不指定任何远程目录,我们的文件将复制到远程用户的家目录。届时会要求我们输入密码,复制过程便开始。

  • 通过目标点编辑文件名会将文件复制并保留原始名称。如果我们希望将文件保存为不同的名称,则需要输入新文件名。
  • 如果 SSH 在远程主机上监听的端口不是默认端口 22,我们可以使用 **-P** 选项指定端口。
  • 要复制任何目录,命令与复制文件非常相似。区别在于我们需要输入 -r 选项进行递归。我们将使用选项 **-r** 将任何目录从本地系统复制到远程系统。

使用 scp 命令将远程文件复制到本地系统

我们将远程位置作为源,本地位置作为目标,将任何远程文件复制到本地系统。**例如,** 要从 IP 地址为 **10.10.0.2** 的任何远程服务器复制名为 **empty.txt** 的文件,请执行以下命令:

如果我们没有在远程机器上设置无密码 SSH 登录,我们将被要求输入我们的用户密码。

使用 scp 命令在两个不同的远程系统之间复制任何文件

与 **rsync** 不同,在使用 scp 命令时,我们不需要登录到任何服务器即可将文件从一个远程系统发送到另一个远程系统。以下命令会将文件 **/empties/empty.txt** 从 **/remote1.com** 远程主机复制到 **/remote2.com** 远程主机上的 **/empties** 目录。

届时会要求我们输入远程帐户的密码。我们的数据将直接在这些远程主机之间传输。

我们将使用 -3 选项来路由通过其执行命令的机器的流量。