16个常用的SCP命令及其示例,用于复制文件和文件夹

scp与ssh协议密切相关,实际上是从相同的思想诞生的。

作为ssh协议的扩展,scp确保在传输过程中数据保持机密和不被篡改。

首先,让我们了解一下scp是如何工作的,然后我们将看到scp命令。

什么是scp?

scp代表安全拷贝协议。

这是一种在本地和远程主机之间或两个远程主机之间复制文件和目录的安全高效的方法。

它被广泛用于在网络上安全地传输数据。scp依赖于ssh(secure shell)来建立安全连接并在传输过程中加密数据。

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

scp如何工作?

scp建立在ssh协议之上,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 /path/to/local/file.txt user@remotehost:/path/to/destination/

/path/to/local/file.txt: 这是要从本地计算机复制的源文件。

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

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

示例:在我的情况下,我选择了一个远程服务器来传输文件。

远程主机用户名 – 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 user@remotehost:/path/to/remote/file.txt /path/to/local/destination/

与上述相同,替换用户和远程主机地址。

示例

scp [email protected]:/users/abhishekvarma/desktop/sample.zip /home/vboxuser/desktop

输出

这只是我的情况下的示例输出。时间戳会根据连接速度而有所变化。

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

#3. 递归复制目录

scp -r user@remotehost:/path/to/remote/directory /path/to/local/destination/

这里的'-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 /path/to/local/*.txt user@remotehost:/path/to/destination/

*.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 /path/to/local/file.txt user@remotehost:/path/to/destination/

这里的'-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 22 /path/to/local/file.txt user@remotehost:/path/to/destination/

‘-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 /path/to/local/file.txt user@remotehost:/path/to/destination/

此“-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 /path/to/local/file.txt user@remotehost:/path/to/destination/

此“-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 user@remotehost:/path/to/remote/file.txt /path/to/local/destination/

与上一个详细输出示例相同,只是本地和远程位置的角色颠倒。

示例

scp -v [email protected]:/users/abhishekvarma/desktop/sample.zip /home/vboxuser/desktop

输出

输出将如下所示。

执行:program /usr/bin/ssh主机192.168.29.70,用户abhishekvarma,命令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行19:包括/etc/ssh/ssh_config.d/*.conf没有匹配的文件
debug1:读取配置数据/etc/ssh/ssh_config
debug1:/etc/ssh/ssh_config行21:应用选项*
debug1:连接到192.168.29.70 [192.168.29.70]端口22。debug1:连接已建立。
debug1:身份文件/root/.ssh/id_rsa类型-1
debug1:身份文件/root/.ssh/id_rsa-cert类型-1 debug1:身份文件/root/.ssh/id_ecdsa类型-1 debug1:身份文件/root/.ssh/id_ecdsa-cert类型-1 debug1:身份文件/root/.ssh/id_ecdsa_sk类型-1 debug1:身份文件/root/.ssh/id_ecdsa_sk-cert类型-1

#10. 使用不同的ssh密钥复制


scp -i /path/to/private_key.pem /path/to/local/file.txt user@remotehost:/path/to/destination/

这个“-i /path/to/private_key.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 file1.txt file2.txt user@remotehost:/path/to/destination/

此命令将file1.txt和file2.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 user@remotehost:/path/to/remote/file.txt /path/to/local/newfilename.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 1000 /path/to/local/file.txt user@remotehost:/path/to/destination/

‘-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 /path/to/local/source/ user@remotehost:/path/to/destination/

‘-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 /path/to/local/file.txt user@remotehost:/path/to/destination/

此命令在文件传输过程中同时使用详细输出(-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 user1@remotehost1:/path/to/remote/file.txt user2@remotehost2:/path/to/destination/

该命令直接从remotehost1传输file.txt到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: 连接被拒绝
连接中断

在这种情况下,错误消息表明ssh连接到源服务器被拒绝。原因可能是主机名、ip地址、端口不正确,或者ssh配置出现问题。

scp常见问题解答

以下是与scp协议相关的一些常见问题及其答案。

scp与ftp或sftp有何不同?

ftp代表文件传输协议。

sftp代表安全文件传输协议。这两者都用于文件传输。

scp通过ssh进行操作,提供了单一协议中的加密和认证,使其更安全和高效。

何时应使用scp?

scp最适合需要安全可靠的文件传输的场景,例如远程备份、软件部署、分发配置文件以及团队成员之间的协作。

scp是否与ipv6地址兼容?

是的,scp支持ipv4和ipv6地址,这使您可以在使用任何编址方案的网络上进行文件传输。

结论✍️

希望您在了解scp及其工作原理方面会有所帮助。

您可能还对了解系统管理员的linux命令感兴趣。

类似文章