深入理解安全复制协议 (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.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 用户名@远程主机:/远程路径/文件.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.txt
从remotehost1
传输到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 配置