如何在 Linux 上使用 scp 命令

已发表: 2022-06-28
笔记本电脑屏幕上的 Linux 终端。
fatmawati achmad zaenuri/Shutterstock.com

scp命令使在 Linux 计算机之间复制文件变得简单而安全。 它使用 SSH 安全性,但最重要的是,它很简单。 如果可以使用cp ,则可以使用scp

安全复制协议和 scp

让我们定义几个术语:有 SCP 和scp 。 大写的 SCP 代表安全复制协议。 小写的scp代表安全cp 。 换句话说,SCP 是一个协议,而scp是一个程序。

scp旨在成为一种在远程 Linux 计算机之间复制文件的安全方法。 它使用 SSH 建立安全连接。 SSH 或安全外壳是一种加密网络协议,通常用于访问和登录远程 Linux 计算机。 在 Linux 发行版上,SSH 功能由 OpenSSH 提供。

如何在 Ubuntu 上设置远程桌面
相关如何在 Ubuntu 上设置远程桌面

SCP 有点长,人们对它在今天的使用表示担忧。 自 OpenSSH 版本 8.8 起,SCP 已被视为已弃用。 scp的现代实现默认使用安全文件传输协议。 SSH 仍用于安全连接,但文件传输由 SFTP 处理。 这一切都是不可见的,并且在幕后神奇地发生,并且scp语法保持不变。

rsync程序比scp更受欢迎,但是您可能会遇到没有安装rsync的计算机,并且您没有 root 权限,这意味着您无法继续安装它。 对于在自包含网络上将文件从计算机复制到计算机, scp非常好。 要使scp正常工作,您必须在要复制到和从中复制的所有计算机上运行 SSH。

要查看计算机上安装的 OpenSSH 版本,请键入:

 ssh -V 

获取 OpenSSH 的版本

复制单个文件

与标准cp命令一样, scp将文件从位置复制到目标位置。 要将文件复制到远程计算机,您必须知道远程计算机的 IP 地址或网络名称。 您还必须拥有对您要将文件发送到的位置具有写入权限的用户帐户的凭据。

要将名为“sample.txt”的文件发送到本地网络上名为“fedora-34”的计算机,语法为:

 scp ./sample.txt [email protected]:/home/dave/Downloads/ 

将单个文件复制到远程计算机

该命令由以下部分组成:

  • scp : scp 命令
  • ./sample.txt :我们要发送的文件。 这是在当前目录中。
  • dave@ :我们要将文件发送到的远程计算机上的用户帐户。
  • fedora-34.local :远程计算机的网络名称。
  • :/home/dave/Downloads/ :将文件复制到远程计算机上的位置。 注意分隔计算机名称和路径的冒号“:”。

系统将提示您输入远程计算机上帐户的密码,然后复制文件。

如果您希望文件在远程计算机上具有不同的名称,您可以将文件名添加到目标路径。 要复制同一个文件并将其命名为“different-file.txt”,请使用以下语法:

 scp ./sample.txt [email protected]:/home/dave/Downloads/different-file.txt 

使用新名称将单个文件复制到远程计算机

scp命令会默默地覆盖现有文件,因此在复制文件时要小心。 如果目标计算机上已经存在与您正在复制的文件同名的文件,它将被覆盖并丢失。

如果目标计算机没有使用默认的 SSH 端口 22,您可以使用-P (端口号)选项提供适当的端口号。

检索单个文件

要从远程服务器复制文件,只需将远程服务器作为源,并将要复制文件的本地路径作为目标。 我们将从远程计算机复制一个名为“development-plan.md”的文件到本地计算机的当前目录。

 scp [email protected]:/home/dave/Downloads/development-plan.md。 

将单个文件从远程服务器复制到本地计算机的当前目录

如果将文件名添加到本地路径,则会复制该文件并赋予该名称。

 scp [email protected]:/home/dave/Downloads/development-plan.md ./dp-1.md 

使用新名称将单个文件从远程服务器复制到本地计算机的当前目录

该文件被复制但重命名为我们指定的文件名。

 ls -hl *.md 

复制多个文件

在任一方向复制多个文件很容易。 您可以列出任意数量的源文件。 在这里,我们复制了两个 markdown 文件和一个 CSV 文件。

 scp ./dp-1.md ./dp-2.md ./dp-3.csv [email protected]:/home/dave/Downloads/ 

将多个命名文件复制到远程计算机

这三个文件被复制到远程计算机。 您也可以使用通配符。 该命令与上一个命令的作用完全相同。

 scp ./dp  [email protected]:/home/dave/Downloads/ 

使用文件名中的通配符将多个文件复制到远程计算机

递归复制目录

-r (递归)选项允许您使用单个命令复制整个目录树。 我们将两个文件放在一个名为“data”的目录中,并在“data”目录中创建了一个名为“CSV”的目录。 我们在“data/CSV”目录中放置了一个 CSV 文件。

此命令复制文件并在远程计算机上重新创建目录结构。

 scp -r ./data [email protected]:/home/dave/Downloads/ 

将目录树复制到远程计算机

在远程服务器之间复制文件

您甚至可以指示scp将文件从一台远程服务器复制到另一台服务器。 语法非常简单。 您提供源服务器的帐户名和网络地址以及目标服务器的帐户名和网络地址。 这些文件从源服务器复制并复制到目标服务器上的位置。

虽然语法很简单,但确保其他一切都到位需要更多的思考。 显然,您尝试将文件复制到远程服务器上的位置必须可由您在命令行中指定的用户帐户访问。 并且该用户帐户必须对该位置具有写入权限。

一个更微妙的先决条件是必须在本地计算机和源计算机之间以及源服务器和目标服务器之间设置 SSH 访问。 确保您可以使用 SSH从源服务器登录到目标服务器。 如果你不能这样做, scp将无法连接。

如何从 Linux Shell 创建和安装 SSH 密钥
相关如何从 Linux Shell 创建和安装 SSH 密钥

设置 SSH 密钥以便您可以使用经过身份验证但无密码的访问是目前首选的方法。 使用密码很快就会变得一团糟,而且——因为系统会提示您输入每个用户帐户的密码——它会阻止您使用脚本完全自动化该过程。

我们为每个远程服务器上使用的用户帐户设置 SSH 密钥。 这为这两个用户提供了对另一台服务器的无缝 SSH 访问。 这允许我们使用这两个用户帐户向任一方向传输文件。

要将文件从 Manjaro 计算机上的“davem”用户帐户复制到 Fedora 计算机上的“dave”帐户,通过我们本地 Ubuntu 计算机发出的scp命令,语法为:

 scp [email protected]:/home/davem/man  [email protected]:/home/dave/ 

将文件从一台远程服务器复制到另一台。

我们默默地返回到命令行。 没有迹象表明发生了什么事。 在没有消息就是好消息的前提下, scp仅报告此远程到远程复制的错误。 在检查 Fedora 计算机时,我们可以看到来自 Manjaro 计算机的文件已被复制和接收。

在 Fedora 计算机上接收的来自 Manjaro 计算机的文件

默认情况下,文件直接从源计算机复制到目标计算机。 您可以使用-3 (三向)选项覆盖它。

使用此选项,文件通过本地计算机从目标传输到源。 为此,需要从本地计算机到目标计算机的无缝 SSH 访问。

 scp -3 [email protected]:/home/davem/man  [email protected]:/home/dave/ 

通过本地计算机将文件从一台远程服务器复制到另一台服务器

即使通过本地计算机传输文件,仍然没有任何迹象表明发生了任何事情。 布丁的证明,当然是检查目标计算机。

其他选项

-p (保留文件属性)将保留传输文件上的原始文件创建、所有权和访问标志。 它们将具有与源计算机上的原始文件相同的元数据。

如果您看到错误消息,请尝试重复该命令并使用-v (详细)标志查看有关传输尝试的详细信息。 您应该能够在输出中发现故障点。

-C (压缩)选项在复制文件时压缩文件,并在收到文件时对其进行解压缩。 这可以追溯到计算机之间的慢速调制解调器通信时代。 减小有效载荷的大小可以减少传输时间。

如今,压缩和解压缩文件所需的时间可能比压缩和未压缩传输之间的差异要长。 但是因为scp最适合用于在同一 LAN 上的计算机之间复制文件,所以传输速度应该不是太大的问题。

相关:如何使用 rsync 备份你的 Linux 系统