scp下载单个文件失败主因是路径格式错误:远程路径必须为user@host:/path(含冒号),本地路径不能加前缀;漏冒号、用户名或主机地址会导致“no such file or directory”或连接卡顿;下载目录须加-r且位置正确;非22端口需用-p 2222并前置;大文件推荐rsync替代。

scp下载单个文件时路径写错会直接失败
命令格式必须是 scp user@host:/remote/path/file /local/path/,漏掉冒号、用户名或主机地址,scp 会报错 No such file or directory 或直接卡在连接阶段。远程路径前必须带 user@host: 前缀,本地路径不能加这个前缀。
常见错误包括:
- 把
user@host:/path写成user@host/path(少冒号) - 本地目标路径末尾多加斜杠导致创建嵌套空目录(如写成
/tmp/而不是/tmp) - 远程路径用相对路径(如
~/file.txt),某些 SSH 配置下可能无法展开,建议用绝对路径
下载整个目录必须加 -r 参数,否则只拷贝空目录
scp 默认不处理子目录和文件,-r 是递归开关,缺了它,命令看似成功,但本地得到的是个空目录。而且 -r 必须紧挨着 scp 命令写,不能放到路径后面。
正确写法:scp -r user@host:/etc/nginx/ ./nginx-backup/
错误写法:scp user@host:/etc/nginx/ -r ./nginx-backup/(-r 位置错,会被当成目标路径的一部分)
注意:远程路径末尾的斜杠不影响内容,但会影响本地目标结构——/nginx/ 和 /nginx 在本地都会生成 nginx-backup/nginx/;如果想让内容直接落在 nginx-backup/ 下,远程路径别加斜杠,或者本地目标路径写成 ./nginx-backup(不加末尾斜杠)。
SSH端口不是22时,-P 参数必须放在源路径之前
-P(大写 P)指定非默认端口,它必须出现在 user@host:/path 这部分之前,否则 scp 会忽略并尝试连 22 端口,结果报错 Connection refused。
正确顺序:scp -P 2222 user@host:/var/log/app.log ./
错误顺序:scp user@host:/var/log/app.log -P 2222 ./(无效)
另外,-P 和端口号之间**不能有空格**,写成 -P2222 也不对,必须是 -P 2222(中间有空格)。
大文件或不稳定网络下,rsync 比 scp 更可靠
scp 不支持断点续传,传输中途断开就得重来;而 rsync 只同步差异部分,适合大文件或弱网环境。但 rsync 需要两端都安装,且默认不保留所有权限(-a 才能等效于 scp -p)。
常用替代命令:rsync -avz -e "ssh -p 2222" user@host:/bigfile.zip ./
关键区别:
-
rsync的-z是压缩传输,scp的-C才对应压缩 -
rsync目标路径如果是目录,末尾是否加斜杠不影响内容层级;scp则完全依赖路径写法 -
rsync第一次运行慢(比对文件),后续同步极快;scp每次都是全量
真正容易被忽略的是:当远程路径含空格或特殊字符时,scp 会出错,而 rsync 同样需要加引号包裹路径——这点两者一致,但很多人只记得给本地路径加引号,忘了远程路径也要引。











