scp命令使在Linux计算机之间复制文件变得简单和安全。它使用SSH安全性,但最重要的是,它很简单。如果可以使用cp,则可以使用scp。
安全复制协议与scp
让我们定义几个术语:SCP和SCP。大写SCP代表安全复制协议。小写的scp代表安全cp。换句话说,scp是一个协议,scp是一个程序。
scp被设计成一种在远程Linux计算机之间复制文件的安全方法。它使用SSH建立安全连接。SSH或安全shell是一种加密网络协议,通常用于访问和登录远程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 [email protected]:/home/dave/Downloads/
该命令由以下部分组成:
- scp:scp命令
- ./样品。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(端口号)选项来提供适当的端口号。
检索单个文件
要从远程服务器复制文件,只需将远程服务器作为源,并将要复制文件的本地路径作为目标。我们将把一个名为“developmentplan.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
复制多个文件
在任意方向复制多个文件都很容易。您可以列出任意多个源文件。在这里,我们复制了两个降价文件和一个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将无法连接。
设置SSH密钥,以便可以使用经过身份验证但无密码的访问是目前首选的方法。密码的使用很快就会变得混乱,因为系统会提示您输入每个用户帐户的密码,这会阻止您使用脚本完全自动化该过程。
我们为每个远程服务器上使用的用户帐户设置SSH密钥。这为这两个用户提供了对另一台服务器的无缝SSH访问。这允许我们使用这两个用户帐户向任意方向传输文件。
要通过本地Ubuntu计算机发出的scp命令将文件从Manjaro计算机上的“davem”用户帐户复制到Fedora计算机上的”dave”帐户,语法为:
scp [email protected]:/home/davem/man. [email protected]:/home/dave/
我们会自动返回到命令行。没有迹象表明发生了什么事。在没有消息是好消息的前提下,scp只报告此远程到远程复制的错误。在检查Fedora计算机时,我们可以看到Manjaro计算机中的文件已被复制和接收。
默认情况下,文件直接从源计算机复制到目标计算机。您可以使用-3(三向)选项覆盖此选项。
使用此选项,文件将通过本地计算机从目标传输到源。为此,需要从本地计算机到目标计算机的无缝SSH访问。
scp -3 [email protected]:/home/davem/man. [email protected]:/home/dave/
即使通过本地计算机传输文件,也没有迹象表明发生了任何事情。当然,布丁的证据是检查目标计算机。
其他选项
-p(保留文件属性)将保留传输文件上的原始文件创建、所有权和访问标志。它们将具有与源计算机上的原始文件相同的元数据。
如果看到错误消息,请尝试重复该命令,并使用-v(verbose)标志查看有关传输尝试的详细信息。您应该能够在输出中发现故障点。
-C(compress)选项在复制文件时压缩文件,并在收到文件时解压缩。这可以追溯到计算机之间的调制解调器通信速度较慢的时代。减小有效载荷的大小可以减少传输时间。
现在,压缩和解压缩文件所需的时间可能比压缩和未压缩传输之间的差异要长。但是,由于scp最适合用于在同一LAN上的计算机之间复制文件,所以传输速度不应该太受关注。
相关:如何使用rsync备份Linux系统