使用scp上传目录报错:为何需目标服务器存在同名目录?
scp上传目录报错"No such file"的原因分析
问题现象
使用scp -r上传本地目录到远程服务器主目录时,若远程主目录下不存在与本地目录同名的目录,会触发如下错误:
$ mkdir test_local $ touch test_local/test_local.txt $ scp -r ./test_local user@host.edu: scp: realpath ./test_local: No such file scp: upload "./test_local": path canonicalization failed scp: failed to upload directory ./test_local to .
但在远程主目录手动创建同名空目录test_local后,scp即可正常同步本地目录内容到远程。已知原生scp无需提前创建目标同名目录,需排查异常原因。
可能的原因
- 老旧scp版本的逻辑缺陷:部分早期OpenSSH版本(尤其是基于传统SCP协议的实现)在处理目录上传时,存在逻辑漏洞——当目标路径下无对应目录时,无法自动创建,反而错误抛出本地目录不存在的异常。
- 远程目录权限异常:远程用户主目录的权限配置错误,导致scp进程无法在其中创建新目录。比如主目录权限为
700但scp执行身份异常,或目录属主/属组与当前用户不匹配。 - 远程路径解析工具故障:远程服务器的
realpath命令或路径解析组件存在问题,导致scp在验证目标路径时,混淆了本地与远程的路径检查逻辑,误报本地目录不存在。 - 非原生scp实现:部分系统的scp是第三方工具(如rsync)的封装版本,这类非原生实现可能存在逻辑偏差,要求目标目录提前存在。
验证与解决方法
- 检查远程scp版本:登录远程服务器执行
scp -V,若为OpenSSH 7.x及更早版本,建议升级到最新稳定版。 - 核对远程主目录权限:执行
ls -ld ~,确保目录权限为755或700,且属主为当前登录用户。 - 切换协议或工具:
- 使用
rsync替代:rsync -av ./test_local user@host.edu: - 强制使用传统SCP协议:
scp -O -r ./test_local user@host.edu:(-O参数可规避部分SFTP协议的兼容性问题)
- 使用
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

