16 个常见 SCP 命令以及复制文件和文件夹的示例

深入理解安全复制协议 (SCP)

SCP协议与SSH协议紧密相连,它们实际上源于相同的安全理念。SCP作为SSH协议的扩展,确保数据在传输过程中保持机密性,并且不会被篡改。

首先,让我们一起探究一下SCP的工作原理,随后我们将详细介绍scp命令的使用方法。

什么是SCP?

SCP,即安全复制协议(Secure Copy Protocol),是一种安全可靠的方法,用于在本地主机和远程主机之间,或者在两个远程主机之间复制文件和目录。

它被广泛应用于通过网络进行安全数据传输。SCP利用SSH(安全外壳)协议来建立安全连接,并在传输过程中对数据进行加密。

无论您是需要移动单个文件还是整个目录,SCP都能为远程文件传输提供一个可靠的解决方案。

SCP如何运作?

SCP协议构建在SSH协议之上,后者是一种用于安全远程登录和命令执行的加密网络协议。它采用与SSH相同的安全机制,包括加密和身份验证,以保护传输过程中的数据安全。

当使用SCP时,用户在本地计算机上发起复制命令,同时指定远程计算机上的源文件和目标位置。SCP建立与远程系统的SSH连接,然后将文件从源安全地复制到目标位置。

何时使用SCP?

SCP在以下场景中表现得尤为出色:

远程服务器备份

SCP允许您将文件从远程服务器备份到本地计算机,或者反之,从而确保数据的冗余和灾难恢复能力。

应用程序部署

当需要在多台服务器上部署应用程序时,SCP可以安全地将必要的文件复制到每个目标系统,简化部署流程。

传输大型文件

对于那些体积过大而无法通过电子邮件附件发送的大型文件,SCP提供了一个可靠且安全的替代传输方案。

安全文件共享

SCP确保数据在整个传输过程中保持加密状态,安全地发送机密文件。

远程协作

SCP可以被用来与不同地点的协作者或团队成员安全地共享文件。

SCP 命令语法

在深入了解如何使用scp命令之前,我们首先来理解它的基本语法结构。

scp命令的语法如下所示:

scp [选项] [源] [目标]

语法解释

选项

这些是可选的标志,用于修改scp命令的行为。通过使用各种选项,您可以自定义传输过程。以下是一些常见的选项:

-r:递归复制目录及其内容。
-p:保留原始文件的权限、时间戳和模式。
-P:指定SSH连接的端口号。
-i:指定SSH认证的私钥文件。
-C:使用压缩来加速数据传输。
-l:限制传输使用的带宽(以Kbit/s为单位)。
-v:详细模式 – 在传输过程中显示调试信息。
-o:将选项传递给 SSH 客户端。它可用于禁用严格的主机密钥检查。

源指定要复制的文件或目录。它可以是本地路径或远程路径,具体取决于上下文。

目标

目标指定要将源复制到的位置。与源一样,它也可以是本地路径或远程路径。

命令示例

#1. 将文件从本地复制到远程服务器

scp /本地路径/文件.txt 用户名@远程主机:/远程路径/

/本地路径/文件.txt: 这是您要从本地计算机复制的源文件。

用户名@远程主机: 将用户名替换为远程用户名,将远程主机替换为远程服务器的主机名或IP地址。

/远程路径/: 这是远程服务器上将复制文件的目标路径。

例子

在本例中,我选择了一台远程服务器进行文件传输。

远程主机用户名:abhishekvarma

远程主机地址:192.168.29.70

scp /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

当连接到远程计算机时,系统会提示您输入密码。这里我选择了一个zip文件进行复制。

输出

如果连接远程服务器没有错误,输出将如下所示。

sample.zip 100% 20KB 717.9KB/s 00:00

#2. 将文件从远程复制到本地计算机

scp 用户名@远程主机:/远程路径/文件.txt /本地路径/

同上,替换用户名和远程主机地址。

例子

scp [email protected]:/Users/abhishekvarma/Desktop/sample.zip /home/vboxuser/Desktop

输出

这仅是我的示例输出。时间戳会根据连接速度而变化。

sample.zip 100% 20KB 51.2KB/s 00:00

#3. 递归复制目录

scp 用户名@远程主机:/远程路径/ /本地路径/

这里的 -r 标志指示scp递归复制目录(包括子目录及其内容)。

例子

scp -r /home/vboxuser/Desktop [email protected]:/Users/abhishekvarma/Desktop

这里,我指定了整个目录来复制文件。

输出

sample.zip                                         100%   20KB    1.0MB/s   00:00
Screenshot from 2023-08-13 21-45-23.png            100%   27KB    1.5MB/s   00:00
.swp                                               100%   12KB  894.2KB/s   00:00
.help.swp                                          100%   12KB  780.4KB/s   00:00

#4. 复制与模式匹配的文件

scp /本地路径/*.txt 用户名@远程主机:/远程路径/

*.txt – 这是一个通配符模式,匹配指定本地目录中所有扩展名为.txt的文件。源路径和目标路径与前面相同。

例子

scp /home/vboxuser/Desktop/locfolder/*.png [email protected]:/Users/abhishekvarma/Desktop

输出

在这里,我尝试使用.png扩展名。

Screenshot from 2023-08-13 21-45-23.png            100%   27KB    1.4MB/s   00:00
Screenshot from 2023-08-13 21-55-28.png            100%   24KB    1.7MB/s   00:00
Screenshot from 2023-08-13 22-04-03.png            100%   38KB    2.1MB/s   00:00

#5. 保留文件属性

scp -p /本地路径/文件.txt 用户名@远程主机:/远程路径/

这里的-p标志在复制时保留源文件的修改时间、访问时间和模式。

例子

scp -p /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

sample.zip                                         100%   20KB    420.0KB/s   00:00

#6. 指定不同的 SSH 端口

scp -P 端口号 /本地路径/文件.txt 用户名@远程主机:/远程路径/

-P标志为SCP连接指定不同的SSH端口(在本例中为22)。您可以使用任何您想要的端口。

例子

scp -P 22 /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

sample.zip                                         100%   20KB    1.2MB/s   00:00

#7. 压缩复制

scp -C /本地路径/文件.txt 用户名@远程主机:/远程路径/

-C 标志在传输期间启用压缩,从而可能减少传输数据的大小。源地址和目标地址与前面解释的相同。

例子

scp -C /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

sample.zip                                         100%   20KB    985.8KB/s   00:00

#8. 用于调试的详细输出

scp -v /本地路径/文件.txt 用户名@远程主机:/远程路径/

-v 选项激活详细输出,在传输过程中提供更详细的信息。

例子

scp -v /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

示例输出将如下所示。

Executing: program /usr/bin/ssh host 192.168.29.70, user abhishekvarma, command scp -v -t /Users/abhishekvarma/Desktop OpenSSH_8.9p1 Ubuntu-3ubuntu0.3, OpenSSL 3.0.2 15 Mar 2022
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to 192.168.29.70 [192.168.29.70] port 22. debug1: Connection established.
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa type -1 debug1: identity file /root/.ssh/id_ecdsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa_sk type -1 debug1: identity file /root/.ssh/id_ecdsa_sk-cert type -1

#9. 使用详细输出从远程复制到本地

scp -v 用户名@远程主机:/远程路径/文件.txt /本地路径/

与前面的详细示例相同的解释,但本地和远程位置的角色相反。

例子

scp -v [email protected]:/Users/abhishekvarma/Desktop/sample.zip /home/vboxuser/Desktop

输出

输出将如下所示。

Executing: program /usr/bin/ssh host 192.168.29.70, user abhishekvarma, command scp -v -f /Users/abhishekvarma/Desktop/sample.zip OpenSSH_8.9p1 Ubuntu-3ubuntu0.3, OpenSSL 3.0.2 15 Mar 2022
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to 192.168.29.70 [192.168.29.70] port 22. debug1: Connection established.
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa type -1 debug1: identity file /root/.ssh/id_ecdsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa_sk type -1 debug1: identity file /root/.ssh/id_ecdsa_sk-cert type -1

#10. 使用不同的 SSH 密钥进行复制

scp -i /私钥路径/私钥文件.pem /本地路径/文件.txt 用户名@远程主机:/远程路径/

-i /私钥路径/私钥文件.pem 标志指定用于身份验证的不同 SSH 私钥。

例子

scp -i /path/to/private_key.pem /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

如果您有私钥,则可以使用它,否则您可以使用默认私钥。

sample.zip                                         100%   20KB    1.1MB/s   00:00

#11. 将多个文件复制到远程服务器

scp 文件1.txt 文件2.txt 用户名@远程主机:/远程路径/

此命令将file1.txtfile2.txt从本地目录复制到远程服务器上的指定目标。

例子

scp  /home/vboxuser/Desktop/image.png  /home/vboxuser/Desktop/sample.zip  [email protected]:/Users/abhishekvarma/Desktop 

输出

image.png                                          100%   39KB    1.4MB/s   00:00
sample.zip                                         100%   20KB    1.5MB/s   00:00

#12. 使用不同的名称复制远程文件

scp 用户名@远程主机:/远程路径/文件.txt /本地路径/新文件名.txt

此命令将file.txt从远程服务器复制到本地目录,并在此过程中将其重命名为newfilename.txt

例子

scp [email protected]:/Users/abhishekvarma/Desktop/sample.zip /home/vboxuser/Desktop/newfile.zip

输出

执行此命令时,新旧文件扩展名应该相同。

sample.zip                                         100%   20KB    28.7KB/s   00:00

#13. 使用特定带宽限制进行复制

scp -l 带宽限制(kbps) /本地路径/文件.txt 用户名@远程主机:/远程路径/

-l 标志指定传输的带宽限制(以 Kbps 为单位)(本例中为 1000 Kbps)。

例子

scp -l 300 /home/vboxuser/Desktop/sample.zip [email protected]:/Users/abhishekvarma/Desktop

输出

sample.zip                                         100%   20KB    31.3KB/s   00:00

#14. 复制文件并保留符号链接

scp -rp /本地路径/源目录/ 用户名@远程主机:/远程路径/

-p 标志保留文件属性,-r 标志递归复制目录。此命令还在复制过程中保留符号链接。

例子

scp -rp /home/vboxuser/Desktop/image.png [email protected]:/Users/abhishekvarma/Desktop

输出

image.png                                        100%   39KB    1.8MB/s   00:00

#15. 通过压缩详细复制文件

scp -vC /本地路径/文件.txt 用户名@远程主机:/远程路径/

此命令在文件传输期间结合了详细输出 (-v) 和压缩 (-C)。

例子

scp -vC /home/vboxuser/Desktop/image.png [email protected]:/Users/abhishekvarma/Desktop

输出

输出将如下所示。

scp: debug1: fd 3 clearing O_NONBLOCK
Sending file modes: C0664 40050 image.png
Sink: C0664 40050 image.png
image.png
d 6 clearing O_NONBLOCK
scp: debug1: fd • clearing O_NONBLOCK
image.png
debug1: client_input_channel_req: channel ✪ type exit-status reply debug1: channel 0: free: client-session, channels 1
Transferred: sent 40220, received 2576 bytes, in 0.1 seconds
Bytes per second: sent 352570.0, received 22581.3
root@ubuntu: ~
debug1: Exit status 0
debug1: compress outgoing: raw data 40287, compressed 38198, factor 0.95 debug1: compress incoming: raw data 792, compressed 757, factor 0.96 

#16. 在两个远程服务器之间复制

如果您想将文件从一台远程服务器传输到另一台服务器,那么您可以使用此命令。

scp 用户1@远程主机1:/远程路径/文件.txt 用户2@远程主机2:/远程路径/

该命令直接将file.txtremotehost1传输到remotehost2

例子

scp user1@remotehost1:/path/to/remote/file.txt [email protected]:/Users/abhishekvarma/Desktop

输出

file.txt 100% 512KB 512.0KB/s 00:00

如果传输过程中出现任何错误或问题,输出可能会显示错误消息,提供有关出错原因的信息。

ssh: connect to host source.example.com port 22: Connection refused
lost connection

在这种情况下,错误消息表明与源服务器的 SSH 连接被拒绝。 这可能是由于多种原因造成的,例如主机名、IP 地址、端口不正确或 SSH 配置