在Linux服务器管理中,文件的安全、高效传输是日常运维的核心任务之一,CentOS作为企业级应用最广泛的Linux发行版,其内置的scp(secure copy)命令凭借其基于SSH协议的高安全性,成为了系统管理员在不同主机间复制文件的首选工具。scp命令不仅加密传输数据,防止信息泄露,而且语法简洁直观,功能强大,能够满足绝大多数远程文件传输需求,本文将全面解析scp命令的用法、选项及其实际应用场景,帮助您熟练掌握这一必备技能。

SCP命令基础语法
scp命令的基本语法结构非常清晰,它遵循“从哪里来,到哪里去”的逻辑模式,其通用格式如下:
scp [选项] [源文件路径] [目标文件路径]
为了更好地理解这个结构,我们可以将其中的关键组成部分拆解说明:
| 参数 | 名称 | 说明 |
|---|---|---|
[选项] |
Options | 用于控制scp行为的参数,如递归复制、指定端口等。 |
[源文件路径] |
Source Path | 要复制的文件或目录的路径,可以是本地路径,也可以是远程路径。 |
[目标文件路径] |
Destination Path | 文件或目录要复制到的目标路径,同样可以是本地或远程路径。 |
远程路径的格式是固定的:用户名@主机名或IP地址:文件路径。root@192.168.1.100:/home/user/data.txt表示远程主机168.1.100上root用户家目录下的data.txt文件。
常见使用场景与实例
掌握了基本语法后,我们来看几个最典型的使用场景,这几乎涵盖了日常工作的90%以上。
从本地复制文件到远程服务器
这是最常见的用法,例如将本地的配置文件或程序包上传到服务器。
scp /local/path/myfile.zip user@remote.server.com:/remote/path/
命令解析:

/local/path/myfile.zip:本地源文件的完整路径。user@remote.server.com:远程服务器的登录用户名和主机地址(或IP)。/remote/path/:远程服务器上用于存放文件的目标目录,执行命令后,系统会提示输入user的密码,验证通过后即开始传输。
从远程服务器复制文件到本地
当需要从服务器下载日志、备份文件或数据时,可以使用此方式。
scp user@remote.server.com:/remote/path/backup.tar.gz /local/path/
命令解析:
user@remote.server.com:/remote/path/backup.tar.gz:远程源文件的完整路径。/local/path/:本地用于存放下载文件的目标目录,同样,需要输入远程用户的密码进行身份验证。
在两个远程服务器之间复制文件
scp的一个强大功能是支持将文件从一个远程服务器直接传输到另一个远程服务器,数据流无需经过本地主机(称为“第三方传输”),这在带宽受限或本地机器性能不足时非常有用。
scp user1@server1.com:/path/to/file.txt user2@server2.com:/another/path/
命令解析:
- 此命令要求本地主机能够同时SSH登录到
server1.com和server2.com。 - 传输过程中,系统会先后提示输入
user1和user2的密码,为了实现自动化,强烈建议配置SSH密钥对认证。
常用选项详解
scp的强大之处在于其丰富的选项,这些选项可以极大地扩展其功能。
| 选项 | 说明 |
|---|---|
-r |
递归复制,用于复制整个目录及其所有子目录和文件,这是复制目录时必须使用的选项。 |
-P |
指定端口,当远程SSH服务使用非标准端口(默认为22)时,使用此选项,注意是大写字母P。 |
-p |
保留属性,小写字母p,保留源文件的修改时间、访问时间和权限模式。 |
-C |
启用压缩,在传输过程中对文件数据进行压缩,可以节省带宽,加快传输速度,尤其适用于大文件或慢速网络。 |
-q |
静默模式,不显示传输进度条和统计信息,适用于脚本自动化执行,减少输出。 |
-v |
详细模式,与-q相反,显示详细的调试信息,包括连接、认证、传输等过程,用于排查问题。 |
-l |
限制带宽,后面跟一个数字(单位Kbit/s),用于限制scp命令占用的带宽,避免影响其他关键业务。 |
综合实例:
将本地的/var/www/html整个目录,通过2222端口,以压缩方式,并保留所有文件属性,复制到远程服务器的/backup目录下。

scp -r -p -C -P 2222 /var/www/html/ user@remote.server.com:/backup/
实用技巧与最佳实践
- 使用SSH密钥认证:为了实现自动化脚本或避免频繁输入密码,应在本地和远程服务器之间配置SSH密钥对(
ssh-keygen和ssh-copy-id),实现无密码登录。 - 处理包含空格的路径:如果文件或目录路径中包含空格,需要用引号将其括起来,
scp "local folder/my file.txt" user@host:/remote/。 - 利用通配符:
scp支持shell通配符,可以批量传输文件。scp *.log user@host:/logs/会将当前目录下所有.log后缀的文件都传输过去。 - 与
rsync的比较:对于需要频繁同步、增量备份或支持断点续传的场景,rsync是比scp更优的选择。rsync只传输有差异的文件部分,效率更高,但对于一次性、简单的安全复制,scp依然是最直接、最方便的工具。
常见问题解答 (FAQs)
问题1:如果使用scp传输一个大文件时网络连接中断了,我该怎么办?能否断点续传?
解答: 很遗憾,原生的scp命令本身不支持断点续传功能,一旦传输中断,你需要重新开始整个传输过程,对于需要断点续传的场景,强烈推荐使用rsync命令。rsync不仅支持断点续传,还能进行增量同步,即只传输文件中发生变化的部分,极大地提高了大文件或不稳定网络环境下的传输效率,一个类似的rsync命令是:rsync -avzP --partial /local/file user@remote:/remote/path/,其中-P选项就包含了--progress(显示进度)和--partial(支持断点续传)的功能。
问题2:为什么scp指定端口的选项是大写的-P,而SSH客户端是-p?这很容易混淆。
解答: 这确实是scp命令设计上的一个历史遗留问题,也是一个常见的“坑”,在早期的scp实现中,小写的-p选项已经被用于“保留文件属性”(preserve times and modes),因此当需要添加指定端口(port)的功能时,为了避免冲突,开发者选择了大写的-P,而SSH客户端(ssh)没有使用-p来保留属性,所以它自然地使用小写的-p来指定端口,虽然这看起来不一致,但已经成为了事实标准,记住一个简单的原则:ssh用小写p,scp用大写P来指定端口。