scp能安全传文件,但命令写错符号、参数大小写或路径顺序即失败;本地路径不带@,远程路径必须为user@host:/path格式;本地→远程、远程→本地、远程→远程方向由源目标位置决定;-P(大写)指定端口,-p(小写)保留权限时间戳;传目录必加-r,否则报“not a regular file”;大文件建议加-C压缩、-l限速、-v调试。

直接说结论:scp 能安全传文件,但命令写错一个符号、参数大小写或路径顺序,就会失败——不是没反应,就是报 not a regular file、Connection refused 或静默退出。
scp 传文件时路径顺序和方向怎么判断
方向完全由「源」和「目标」的位置决定,跟动词无关。本地路径不带 @,远程路径必须是 user@host:/path 格式,冒号不能少。
- 本地 → 远程:
scp /local/file.txt user@host:/remote/ - 远程 → 本地:
scp user@host:/remote/file.txt ./ - 远程A → 远程B(经本地中转):
scp user1@host1:/file user2@host2:/dest—— 数据先下到你本地再上传,别误以为是直连
-P 和 -p 完全不同,写反就传失败
-P(大写)是端口,-p(小写)是保留权限和时间戳。很多人输成 -p 2222,结果报错 ssh: connect to host ... port 22: Connection refused,其实是连了默认 22 端口,而服务在 2222 上。
- 指定非标端口(如 2222)必须用:
scp -P 2222 file.txt user@host:/dir/ - 想保留修改时间、权限,才用:
scp -p file.txt user@host:/dir/ - 两个都要?可以一起写:
scp -P 2222 -p file.txt user@host:/dir/
传目录必须加 -r,否则报 “not a regular file”
scp 默认只认单个文件。传整个文件夹却不加 -r,会直接报错,而不是跳过子目录或提示你加参数。
- 正确:
scp -r ./myapp/ user@host:/opt/ - 错误:
scp ./myapp/ user@host:/opt/→ 报scp: ./myapp/: not a regular file - 注意目录末尾斜杠:
./myapp/会把内容复制进去;./myapp会把整个目录名也复制过去(即/opt/myapp/)
大文件或慢网时容易卡住,几个关键参数要提前加
默认传输不压缩、不限速、不显示进度,遇到几百 MB 的日志或镜像,可能卡住没反馈,让人误以为挂了。
- 启用压缩节省带宽:
scp -C big.tar.gz user@host:/backup/ - 限速防打满带宽(单位 Kbit/s):
scp -l 5000 file.iso user@host:/iso/ - 调试连不上时加
-v看具体卡在哪步:scp -v -P 2222 test.conf user@host:/etc/ - 如果目标机磁盘满或权限不足,
scp不会提前检查,直到最后才报Permission denied或No space left on device
真正麻烦的不是语法记不住,而是错误信息太笼统——scp 不告诉你缺了 -r、写错了 -P、还是远程路径不存在。动手前先 ssh user@host ls /target/path 验证路径和权限,比反复试更省时间。


















