SCP传文件失败常见于密钥认证未配置或路径错误:先用ssh测试登录,用-o PubkeyAuthentication=no临时密码登录;传目录用scp -rp保留权限时间戳,但符号链接会被展开;务必预检目标路径是否存在,避免文件“消失”。

scp 命令传文件失败,常见报错 Permission denied (publickey) 怎么办
这不是密码输错了,而是默认走密钥认证,且本地没配好对应私钥或远程没放公钥。scp 默认复用 SSH 的认证逻辑,不识别 -p(那是保留权限的参数,不是密码开关)。
- 先确认能否用
ssh user@host登录成功;不能就别急着传文件,先解决登录问题 - 如果要用密码登录(比如测试机),加
-o PubkeyAuthentication=no关闭密钥尝试:scp -o PubkeyAuthentication=no file.txt user@host:/path/ - 生产环境建议配密钥:用
ssh-copy-id user@host推公钥,比手动改~/.ssh/authorized_keys少出错
传输大文件时卡住、速度慢,scp 有没有提速参数
scp 底层是 SSH 加密通道,加密开销大,尤其在千兆以上网络或高延迟链路下,吞吐容易被拖垮。它本身不支持断点续传,也没内置压缩开关。
- 加
-C开启 SSH 压缩(对文本类文件有效,二进制如 zip、mp4 反而更慢):scp -C big.log user@host:/tmp/ - 换
rsync更可控:rsync -avz --progress file.tar.gz user@host:/data/,支持断点、排除、限速(--bwlimit=1000单位 KB/s) - 真要极限速度,考虑
nc+tar管道(无加密!仅内网可信环境):tar cf - dir/ | nc host 9999,远端提前跑nc -l 9999 | tar xf -
复制目录、保持权限和时间戳,scp -r 足够吗
够用,但有细节陷阱:-r 是递归,但默认不保留所有元数据;权限和时间戳需要额外参数配合,而且符号链接处理方式容易误伤。
- 基础递归复制:
scp -r mydir/ user@host:/backup/(注意末尾斜杠,mydir和mydir/行为不同) - 加
-p保留权限、所有者、时间戳:scp -rp mydir/ user@host:/backup/(但所有者只在你有 sudo 权限时才生效) - 符号链接默认被展开成实际文件;若想保留链接本身,得用
rsync -av或先打包:tar cf - mydir | ssh user@host 'tar xf -'
目标路径写错导致文件“消失”,scp 有没有安全模式或预检
没有。scp 不做路径存在性校验,也不会提示“目标目录不存在将创建”,它直接把文件名当完整路径处理——这是最常丢文件的地方。
- 传前先连过去确认路径:
ssh user@host 'ls -d /target/dir/',返回No such file就别硬传 - 避免省略用户和主机之间的冒号:
scp file.txt user@host:(结尾冒号表示家目录),写成user@host(无冒号)会当成本地路径,文件就留在本机当前目录了 - 跨用户传输时注意权限:目标目录需对目标用户可写,否则报
scp: failed to upload file,而不是明确说“没权限”
路径拼写、冒号有无、用户上下文切换——这三个地方出错,文件就静默去向不明。多敲一次 ssh 预检,比重传十次强。










