scp 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
scp——网络与远程命令族(见网络命令族),建立在 ssh 之上。
scp(secure copy,安全拷贝)走 SSH 加密通道在主机间传文件。语法刻意做得像 cp,只是把"远程路径"写成 user@host:/path 的形式。临时传个文件、拉份日志,用它最顺手。
一、基本拷贝
scp file.txt user@host:/tmp/ # 本地 → 远程
scp user@host:/var/log/app.log ./ # 远程 → 本地
scp user@host:/a.txt user@host2:/b.txt # 远程 → 远程(经本地中转)
scp -r ./mydir user@host:/opt/ # -r 递归拷目录
scp -P 2222 file user@host:/tmp/ # 指定 SSH 端口(注意是大写 P)远程路径写法固定是
user@host:路径,冒号不能省——user@host/tmp会被当成本地相对路径。端口参数是大写-P(和 ssh 的小写-p相反),这是 scp 最容易写错的点,拷不上去先检查大小写。
二、保留属性与限速
scp -p file user@host:/tmp/ # 保留修改时间、访问时间、权限
scp -r -P 2222 dir/ user@host:/opt/
scp -l 8192 big.iso user@host:/data/ # -l 限速,单位 Kbit/s,8192=1MB/s
scp -C file user@host:/tmp/ # -C 传输时压缩,慢网络提速
-l限速在带宽紧张、不想把服务器带宽打满时很有用,单位是 Kbit/s(不是 KB/s),8192约 1 MB/s。-p保留时间戳,传日志、备份时常用,否则远端看到的全是"刚传的"时间,排查时间线会乱。
三、用通配符与多文件
scp "user@host:/var/log/*.log" ./logs/ # 远程通配(引号防本地展开)
scp a.txt b.txt user@host:/tmp/ # 多个本地文件一次传远程通配符必须加引号,否则 shell 会在本地先展开、找不到文件就报错。引号让
*原样传给远端 ssh,由远端去匹配。这是个高频坑。
四、scp vs rsync:怎么选
| 维度 | scp | rsync |
|---|---|---|
| 机制 | 整文件传输 | 增量传输(只传差异块) |
| 断点续传 | 不支持 | 支持(--partial) |
| 大目录重复传 | 全量重传,慢 | 只传变更,快 |
| 进度/限速 | 简单 | 更细(--bwlimit、--progress) |
| 语法熟悉度 | 像 cp,上手快 | 参数多,略复杂 |
经验法则:一次性、小文件、偶尔传 →
scp够了,简单直接;大目录、频繁同步、可能中断 → 用 rsync,增量和断点续传能省大量时间。另外scp在较新 OpenSSH 里已被标记为"未来可能弃用传统实现",长期看 rsync/sftp更稳,但当下scp仍是临时传文件最顺手的选择。
五、实战:拉取线上日志到本地分析
# 拉整个日志目录到本地,限速 2MB/s,保留时间
scp -r -p -l 16384 user@web:/var/log/nginx ./nginx-logs/
# 只拉今天的 access 日志(远程通配需引号)
scp -p "user@web:/var/log/nginx/access.log.$(date +%Y-%m-%d)" ./拉下来后就可以用本地的 grep/awk 慢慢分析,不占服务器资源、也不怕把线上文件改坏。
一句话总结
scp = 走 SSH 加密通道的安全拷贝,语法仿 cp,远程路径写 user@host:路径(冒号必带、通配要引号)、端口是大写 -P、-r 递归、-l 限速、-C 压缩、-p 保留时间;小文件偶尔传用 scp 最省事,大目录频繁同步换 rsync 增量更稳。