scp是最直接稳妥的SSH文件传输工具,只需两端SSH互通即可使用,支持本地↔远程、远程↔远程三种方向,路径中必须正确使用user@host:格式和冒号,-r选项用于递归传目录,-C和-o ConnectTimeout=10可优化体验,但不支持断点续传或增量同步。

scp 是最直接、最稳妥的选择,只要两台服务器能通过 SSH 互通,就能立刻用起来。它不依赖额外服务(如 NFS、FTP),也不需要在目标端安装客户端,加密和认证都复用 SSH 配置,省心且安全。
用 scp 拷文件:记住方向和冒号位置
命令结构是固定的:scp [选项] ,关键在于「谁是源、谁是目标」以及路径前的 @ 和 : 是否写对。
-
scp file.txt user@192.168.1.100:/tmp/:把本地file.txt传到远程服务器的/tmp/目录下 -
scp user@192.168.1.100:/var/log/syslog /backup/:把远程的syslog拉回本地/backup/ -
scp user1@192.168.1.100:/data/config.yaml user2@192.168.1.101:/etc/:直接在两台远程服务器间中转(本机只做跳板)
常见错误:scp user@host:/path/file user@host:/path/ 这种写法会报错——scp 不支持同一主机上“本地→本地”式拷贝,得换 cp;另外漏掉 :(比如写成 user@host/path)会导致命令试图在本地找这个路径,而不是走 SSH。
用 scp -r 拷整个目录:注意是否带末尾斜杠
-r 参数必须加,否则会报 not a regular file。但目录路径结尾的 / 会影响行为:
-
scp -r dir/ user@host:/target/:把dir下所有内容复制进去(不创建dir这层目录) -
scp -r dir user@host:/target/:把dir整个目录(含名字)复制过去,结果是/target/dir/
如果目标路径不存在,scp 不会自动创建父目录,会失败。先手动 ssh user@host 'mkdir -p /target' 更可靠。
绕过密码输错或连接中断:加 -o ConnectTimeout=10 和 -C
默认超时时间太长(常卡住几十秒),尤其网络不稳定时体验很差。加 -o ConnectTimeout=10 可让连接 10 秒无响应就放弃;加 -C 启用压缩,对文本类日志、配置文件能明显提速(但对已压缩文件如 .zip 基本无效,甚至略慢)。
- 推荐组合:
scp -C -o ConnectTimeout=10 -o ServerAliveInterval=30 file.tar.gz user@host:/data/ -
ServerAliveInterval=30防止中间 SSH 连接被防火墙或 NAT 设备静默断开
别用 -q(静默模式)掩盖问题——进度条消失后你根本不知道是卡了还是真在跑。
大目录或需增量同步时,rsync 才是正解
scp 每次都是全量传输,改了一个字节也重传整个文件。rsync 通过对比文件大小+修改时间+校验和(可选)判断差异,只传变化部分,适合备份、持续同步场景。
- 基础用法:
rsync -avz -e "ssh -p 2222" /local/dir/ user@host:/remote/dir/(注意源路径末尾有/) -
-a保留权限、时间戳等元数据;-v显示细节;-z压缩传输;-e指定 SSH 参数(如非标端口) - 首次同步可能比
scp -r慢一点(要扫描比对),但后续同步快得多,且支持--delete清理目标端多余文件
rsync 的坑在于:如果目标路径写成 /remote/dir(没斜杠),它会把源目录整个塞进 /remote/dir 里,变成 /remote/dir/dir/——这和 scp 的行为逻辑刚好相反,务必留神。
scp 开箱即用;目录大、要反复同步、或者担心传一半断掉重来耗时,直接切到 rsync。两者命令格式看着像,底层逻辑完全不同,混用容易出错。


















