Linux scp 命令详解
scp(Secure Copy Protocol)是 Linux 下用于在本地主机与远程主机之间(或两个远程主机之间)安全复制文件和目录的命令。它基于 SSH 协议进行加密传输,比传统的 cp 或 rcp 更安全(rcp 不加密)。scp 传输时会占用较少资源,适合小文件众多或系统负载高的场景,但速度可能略慢于 rsync。
scp 默认使用 SSH 的端口 22,需要远程主机开启 SSH 服务,并确保有正确的权限(通常需配置 SSH 免密登录以避免每次输入密码)。
基本语法
scp [选项] 源路径 目标路径
- 源路径和目标路径格式:
- 本地路径:直接写文件/目录路径(如
/home/file.txt) - 远程路径:
用户@主机:路径(如root@192.168.1.100:/home/file.txt) - 如果省略用户名,默认使用当前用户。
- 从本地复制到远程:本地路径在前,远程路径在后。
- 从远程复制到本地:远程路径在前,本地路径在后。
常用选项
| 选项 | 说明 |
|---|---|
| -r | 递归复制,用于复制目录及其所有内容(必须加,否则目录会报错)。 |
| -p | 保留原文件的修改时间、访问时间和权限模式。 |
| -P port | 指定远程主机的 SSH 端口(大写 P,默认 22)。 |
| -C | 启用压缩传输,适合大文件或慢网络,可加快速度。 |
| -v | 详细模式,显示调试信息,用于排查连接问题。 |
| -q | 安静模式,不显示进度条和警告信息。 |
| -l limit | 限速传输(单位 Kbit/s,例如 -l 800 限制为 100KB/s)。 |
| -i key | 指定私钥文件,用于密钥认证(例如 -i ~/.ssh/id_rsa)。 |
| -o option | 传递 SSH 选项(如 -o StrictHostKeyChecking=no)。 |
| -O | 使用旧版 SCP 协议(兼容老服务器)。 |
实用示例
- 本地文件上传到远程主机
scp /本地/文件.txt user@192.168.1.100:/远程/目录/
示例:上传当前目录下的 test.txt 到远程 /home/user/
scp test.txt root@192.168.1.100:/home/user/
- 本地目录上传到远程主机(递归)
scp -r /本地/目录/ user@192.168.1.100:/远程/目录/
示例:上传整个 logs 目录
scp -r /var/logs/ root@192.168.1.100:/backup/
- 从远程主机下载文件到本地
scp user@192.168.1.100:/远程/文件.txt /本地/目录/
示例:下载远程配置文件到当前目录
scp root@192.168.1.100:/etc/nginx/nginx.conf ./
- 从远程主机下载目录到本地(递归)
scp -r user@192.168.1.100:/远程/目录/ /本地/目录/
示例:下载整个 web 目录
scp -r root@192.168.1.100:/var/www/html/ ./backup/
- 指定非默认端口(例如 2222)
scp -P 2222 文件.txt user@主机:/路径/
scp -P 2222 -r 目录/ user@主机:/路径/
- 启用压缩 + 保留属性 + 限速
scp -C -p -l 1024 大文件.zip user@主机:/路径/
- 两个远程主机之间直接复制(通过本地中转)
scp user1@主机1:/文件.txt user2@主机2:/路径/
(数据会经过本地主机中转,如果不想中转可加 -3 选项强制本地路由)
- 使用密钥认证(免密码)
先配置 SSH 密钥,然后:
scp -i ~/.ssh/id_rsa 文件.txt user@主机:/路径/
注意事项
- scp 会覆盖目标同名文件,谨慎操作。
- 如果网络慢或文件大,推荐加 -C 压缩。
- 对于大量小文件,scp 比 rsync 更不占资源。
- 出错常见原因:SSH 未开启、端口不对、权限不足、防火墙阻塞。
- 调试时加 -v 查看详细日志。
- 现代 OpenSSH 默认使用 SFTP 协议(更快更安全),旧服务器可能需 -O 使用传统 SCP。
scp 是日常运维中非常实用的文件传输工具,结合 SSH 密钥可实现自动化。如果你的场景涉及断点续传或同步,建议考虑 rsync 或 sftp。
有具体传输场景或问题,可以提供更多细节,我再帮你优化命令!