如何在 Linux 上使用 scp 命令

scp
命令使在 Linux 计算机之间复制文件变得简单和安全。它使用 SSH 安全性,但最重要的是,它很简单。如果可以使用cp
,就可以使用scp
。
安全复制协议和 scp
让我们定义几个术语:SCP 和 scp
。大写的 SCP 代表安全复制协议。小写的 scp
代表安全 cp
。换句话说,SCP 是一个协议,scp
是一个程序。
scp
旨在成为一种在远程 Linux 计算机之间复制文件的安全方式。它使用 SSH 建立安全连接。 SSH,或安全外壳,是一种加密网络协议,通常用于访问和登录远程 Linux 计算机。在 Linux 发行版上,SSH 功能由 OpenSSH 提供。
SCP 有点老生常谈了,人们对它在当今的使用表示担忧。自 OpenSSH 版本 8.8 起,SCP 已被认为已弃用。 scp
的现代实现默认使用安全文件传输协议。 SSH 仍用于安全连接,但文件传输由 SFTP 处理。这一切都是不可见的,并且在幕后神奇地发生,并且 scp
语法保持不变。
rsync
程序优于 scp
,但您可能会遇到一台没有安装 rsync
的计算机,而您也没有安装拥有 root 权限意味着您无法继续安装它。要在独立网络上将文件从一台计算机复制到另一台计算机,scp
非常适合。要使 scp
正常工作,您必须在所有要复制的计算机上运行 SSH。
要查看计算机上安装的 OpenSSH 版本,请键入:
ssh -V

复制单个文件
与标准的 cp
命令一样,scp
将文件从源 位置复制到目标 位置。要将文件复制到远程计算机,您必须知道远程计算机的 IP 地址或网络名称。您还必须拥有一个用户帐户的凭据,该用户帐户对您要将文件发送到的位置具有写入权限。
要将名为“sample.txt”的文件发送到本地网络上名为“fedora-34”的计算机,语法为:
scp ./sample.txt dave@fedora-34.local:/home/dave/Downloads/

该命令由以下部分组成:
- scp: scp 命令
- ./sample.txt:我们要发送的文件。这是在当前目录中。
- dave@:我们要将文件发送到的远程计算机上的用户帐户。
- fedora-34.local:远程计算机的网络名称。
- :/home/dave/Downloads/:将文件复制到远程计算机上的位置。请注意分隔计算机名称和路径的冒号“:”。
系统将提示您输入远程计算机上的帐户密码,然后复制文件。
如果您希望该文件在远程计算机上具有不同的名称,您可以将文件名添加到目标路径。要复制同一文件并将其命名为“different-file.txt”,请使用以下语法:
scp ./sample.txt dave@fedora-34.local:/home/dave/Downloads/different-file.txt

scp
命令会悄悄地覆盖现有文件,所以在复制文件时要小心。如果目标计算机上已存在与您正在复制的文件同名的文件,该文件将被覆盖并丢失。
如果目标计算机未使用默认的 SSH 端口 22,您可以使用 -P
(端口号)选项来提供适当的端口号。
检索单个文件
要从 远程服务器复制文件,只需将远程服务器作为源,然后将要复制文件的本地路径作为目标。我们将从远程计算机复制一个名为“development-plan.md”的文件到本地计算机的当前目录。
scp dave@fedora-34.local:/home/dave/Downloads/development-plan.md .

如果您将文件名添加到本地路径,则会复制该文件并为其命名。
scp dave@fedora-34.local:/home/dave/Downloads/development-plan.md ./dp-1.md

该文件被复制但重命名为我们指定的文件名。
ls -hl *.md

复制多个文件
在任一方向复制多个文件很容易。您可以列出任意数量的源文件。在这里,我们复制了两个降价文件和一个 CSV 文件。
scp ./dp-1.md ./dp-2.md ./dp-3.csv dave@fedora-34.local:/home/dave/Downloads/

这三个文件被复制到远程计算机。您也可以使用通配符。该命令与上一个命令的作用完全相同。
scp ./dp. dave@fedora-34.local:/home/dave/Downloads/

递归复制目录
-r
(递归)选项允许您使用单个命令复制整个目录树。我们将两个文件放在一个名为“data”的目录中,并在“data”目录中创建了一个名为“CSV”的目录。我们在“data/CSV”目录中放置了一个 CSV 文件。
此命令复制文件并在远程计算机上重新创建目录结构。
scp -r ./data dave@fedora-34.local:/home/dave/Downloads/

在远程服务器之间复制文件
您甚至可以指示 scp
将文件从一台远程服务器复制到另一台。语法非常简单。您提供源服务器的帐户名和网络地址以及目标服务器的帐户名和网络地址。文件从源服务器复制并复制到目标服务器上的位置。
尽管语法很简单,但要确保其他一切都到位需要多加考虑。显然,您尝试将文件复制到远程服务器上的位置必须可由您在命令行中指定的用户帐户访问。并且该用户帐户必须对该位置具有写入权限。
一个更微妙的先决条件是,必须在本地计算机和源计算机之间以及源服务器和目标服务器之间设置 SSH 访问。确保您可以使用 SSH 从源服务器登录到目标服务器。如果你做不到,scp
将无法连接。
设置 SSH 密钥以便您可以使用经过身份验证但无密码的访问是目前首选的方法。使用密码很快就会变得混乱,而且——因为系统会提示你输入每个用户帐户的密码——它会阻止你使用脚本完全自动化该过程。
我们为每个远程服务器上使用的用户帐户设置 SSH 密钥。这为这两个用户提供了对另一台服务器的无缝 SSH 访问。这允许我们使用这两个用户帐户双向传输文件。
要将文件从 Manjaro 计算机上的“davem”用户帐户复制到 Fedora 计算机上的“dave”帐户,通过我们本地 Ubuntu 计算机发出的 scp
命令,语法为:
scp davem@manjaro20-0-1.local:/home/davem/man. dave@fedora-34.local:/home/dave/

我们默默地回到了命令行。没有任何迹象表明发生了什么。在没有消息就是好消息的前提下,scp
只报告远程到远程复制的错误。查看 Fedora 电脑,可以看到 Manjaro 电脑的文件已经被复制并接收。

默认情况下,文件直接从源计算机复制到目标计算机。您可以使用 -3
(三向)选项覆盖它。
使用此选项,文件将通过您的本地计算机从目标传输到源。为此,需要从本地计算机到目标计算机的无缝 SSH 访问。
scp -3 davem@manjaro20-0-1.local:/home/davem/man. dave@fedora-34.local:/home/dave/

仍然没有任何迹象表明发生了任何事情,即使通过本地计算机传输文件也是如此。布丁的证明,当然是检查目标计算机了。
其他选项
-p
(保留文件属性)将在传输的文件上保留原始文件的创建、所有权和访问标志。它们将具有与源计算机上的原始文件相同的元数据。
如果您看到错误消息,请尝试重复该命令并使用 -v
(详细)标志查看有关传输尝试的详细信息。您应该能够在输出中发现故障点。
-C
(压缩)选项在复制文件时压缩文件,并在收到文件时解压缩文件。这可以追溯到计算机之间使用慢速调制解调器通信的时代。减小有效载荷的大小可以减少传输时间。
如今,压缩和解压缩文件所花费的时间可能比压缩和未压缩传输之间的差异要长。但是因为 scp
最适合在同一局域网内的计算机之间复制文件,所以传输速度应该不是什么大问题。