从Linux向Windows用scp传文件报错:'C:\Program'未被识别
为啥会报这个错?
这个报错的根子在于Windows上OpenSSH的scp程序路径带空格,而Windows的shell处理这类路径时没加引号,直接把路径拆碎了。
具体说:你装的OpenSSH默认路径是C:\Program Files\OpenSSH\,scp.exe的完整路径就是C:\Program Files\OpenSSH\scp.exe。当你从Linux跑scp命令传文件时,Windows的sshd服务会调用本地的scp来接收,但它直接用了没加引号的路径——Windows的cmd/powershell看到空格就会把路径切成C:\Program和后面的部分,自然就认不出这个“命令”了,于是就弹出那个报错。
不用额外工具的解决办法
给你几个纯靠原生OpenSSH就能搞定的方案,适合自动化脚本场景:
方案1:改Windows注册表,让sshd用带引号的scp路径(一劳永逸)
这是最适合自动化的方案,改一次就不用管了:
- 按Win+R输入
regedit打开注册表编辑器。 - 找到路径:
HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH。 - 右键
OpenSSH项,新建「字符串值」,命名为scp。 - 把数值数据改成带双引号的完整路径:
"C:\Program Files\OpenSSH\scp.exe"。 - 打开PowerShell,执行
Restart-Service sshd重启OpenSSH服务。
之后再传文件就不会有这个问题了。
方案2:Linux端scp命令加参数指定路径(临时应急)
如果不想碰注册表,每次执行scp时可以用-S参数指定Windows侧的scp路径,注意要转义引号:
scp -S '"C:\Program Files\OpenSSH\scp.exe"' fileNameA user@windowServer:fileNameA
不过这个每次都要加参数,脚本里写起来有点麻烦,还是方案1更省心。
方案3:重装OpenSSH到无空格路径(可选)
如果允许重装的话,把OpenSSH装到C:\OpenSSH\这种没有空格的路径里,默认路径就不会触发这个问题,不用额外配置。
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

