简介
scp,全称 “secure copy” 即“安全拷贝”,scp 命令基于 SSH (Secure Shell) 协议,用于在 Linux 系统之间或 Linux 系统与本地计算机之间安全地传输文件。它通过加密数据传输过程,防止敏感信息在网络上被窃取,保证了文件传输的安全性。底层原理是利用 SSH 协议建立安全的连接,然后通过该连接进行文件复制。
使用方式
scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ...
target
常用参数
-3
:在两个远程主机之间复制文件时,数据会强制通过执行scp
命令的本地主机进行中转传输。如果不使用此选项,数据将尝试在两个远程主机之间直接传输。注意,当使用旧版SCP
协议时,此选项会为第二个远程主机启用批处理模式,因为scp
无法同时询问两个远程主机的密码或口令。-4
:强制scp
仅使用 IPv4 。-6
:强制scp
仅使用 IPv6 。-A
:允许将ssh-agent(1)
转发到远程系统,默认情况下不进行转发。-B
:使用批处理模式(避免询问密码或口令)。-C
:启用压缩。此选项将-C
传递给ssh(1)
,以启用数据传输过程中的压缩。-c cipher
:指定用于加密数据传输的加密算法。此选项会直接传递给ssh(1)
。-D sftp_server_path
:当通过-s
选项使用SFTP
协议时,直接连接一个本地的SFTP
服务器而不是通过ssh(1)
连接一个远程的。该选项可能在调试客户端和服务器时比较有用。-F ssh_config
:指定一个备用的用户级ssh
配置文件路径。此选项会直接传递给ssh(1)
。-i identity_file
:指定用于公钥认证的身份文件(即私钥文件)的路径。此选项会直接传递给ssh(1)
。-J destination
:通过一个或多个跳板机(Jump Host)连接到目标主机。它会首先建立到由destination
指定的跳板机的scp
连接,然后从跳板机建立到最终目标主机的 TCP 转发连接。你可以用逗号分隔指定多个跳板机。这是ProxyJump
配置指令的一个快捷方式。此选项会直接传递给ssh(1)
。-l limit
:限制使用的带宽,单位是Kbit/s
。-O
:使用原始的SCP
协议进行文件传输,而不是SFTP
协议。在以下情况可能需要使用此选项:连接的服务器不支持SFTP
;为了向后兼容特定的文件名通配符模式;为了让旧版本的SFTP
服务器能正确解析以~
开头的路径。注意,此模式是默认的文件传输模式。-o ssh_option
:允许将ssh_config(5)
手册页中定义的各种选项直接传递给底层的ssh
命令。这在你需要使用scp
命令本身没有独立命令行参数来对应的ssh
配置时非常有用。关于这些选项的完整列表及其可能的值,请参考ssh_config(5)
手册页。-P port
:指定连接到远程主机的端口号。注意,这个选项使用的是大写的P
,因为小写的-p
选项已经被保留用于保留文件属性。-p
:保留源文件的修改时间、访问时间以及文件权限模式。-q
:安静模式:禁用进度显示条,同时也会抑制来自ssh(1)
的警告和诊断信息。-R
:用于在两个远程主机之间进行文件复制。scp
会连接到源文件所在的主机,并在该主机上执行scp
命令来完成复制。这要求源主机上的scp
能够无需密码就认证连接到目标主机。-r
:递归复制整个目录及其内容。scp
在遍历目录树时会解析遇到的符号链接,复制符号链接所指向的文件而不是符号链接本身。-S program
:指定用于加密连接的程序。这个程序必须能够理解ssh(1)
的选项。-s
:使用SFTP
协议来替代原始的scp
协议。-T
:禁用严格的文件校验。默认情况下,当从远程主机复制文件到本地目录时,scp
会检查接收到的文件名是否与命令行中请求的文件名匹配,以防止远程端发送意外或不需要的文件。由于不同操作系统和Shell
对文件名通配符的解释方式不同,这种检查有时可能会导致需要的文件被拒绝。使用此选项会禁用这些检查,但代价是完全信任服务器不会发送意外的文件名。-v
:详细模式。开启此选项会使scp
和ssh(1)
输出详细的调试信息,包括连接、认证和配置过程。这对于排查问题非常有帮助。
返回值
0
:指令执行成功。>0
:指令执行失败。
参考示例
从本地复制文件到远程主机
scp localfile.txt user@remotehost:/path/to/destination/
使用 scp
时将本地文件写在前,远程路径写在后即可实现从本地复制指定文件到远程主机的功能。注意此时一般会需要输入远程主机的密码:
jay@ubuntu:~/test$ scp test.txt jay@192.168.2.110:/home/jay/test
jay@192.168.2.110's password:
test.txt 100% 0 0.0KB/s 00:00
jay@ubuntu:~/test$
从远程主机复制文件到本地
scp user@remotehost:/path/to/remote/file.txt /path/to/local/
将远程文件路径前置,本地路径跟随其后即可实现从远程主机复制文件到本地的功能:
jay@ubuntu:~/test$ scp jay@192.168.2.110:/home/jay/test/hello.txt ./
jay@192.168.2.110's password:
hello.txt 100% 12 11.5KB/s 00:00
jay@ubuntu:~/test$ ls
hello.txt test.txt
jay@ubuntu:~/test$
复制目录及其内容到远程主机
scp -r localdir user@remotehost:/path/to/destination/
使用 -r
选项可以传输整个文件夹:
jay@ubuntu:~/test$ scp -r jay@192.168.2.110:/home/jay/test/code ./
jay@192.168.2.110's password:
app 100% 16KB 1.0MB/s 00:00
Makefile 100% 212 83.4KB/s 00:00
b.h 100% 222 107.7KB/s 00:00
a.c 100% 319 173.7KB/s 00:00
a.h 100% 160 88.4KB/s 00:00
a.o 100% 1632 481.5KB/s 00:00
jay@ubuntu:~/test$ ls
code hello.txt test.txt
jay@ubuntu:~/test$
注意事项
- 确保你有权限访问源文件和目标路径。
- 如果远程主机使用了非标准 SSH 端口,需要使用
-P
参数指定端口。 - 默认使用的原始
SCP
协议需要在远程用户的Shell
环境中执行命令来完成通配符glob(3)
模式匹配。这意味着你需要非常小心地引用那些对远程Shell
有特殊含义的字符,例如各种引号字符本身,以避免Shell
对其进行不期望的解释。