Windows下SSH配置exec命令无法识别含空格路径的问题求助
解决Windows OpenSSH Match exec命令中带空格路径的问题
Windows下OpenSSH客户端的Match exec指令对带空格的路径解析逻辑和ProxyCommand等其他指令不同,常规的引号或转义方式无法生效,以下是几种可行的解决方法:
方法1:使用Windows短路径(8.3格式)
Windows会为带空格的目录生成一个短路径(8个字符以内的名称加~1后缀),直接用短路径替换带空格的路径,不需要引号即可被exec识别:
- 查看短路径:打开命令提示符,执行
dir /x 父目录路径,比如查看用户目录的短路径:
找到dir /x C:\UsersUser Name对应的短路径(比如USERNA~1),同理查看Project Directory的短路径(比如PROJEC~1)。 - 修改后的SSH配置示例:
Match host vm.example.com exec "C:\Users\USERNA~1\PROJEC~1\cloudflared.exe access ssh-gen --hostname %h" HostName vm.example.com ProxyCommand "C:\Users\User Name\Project Directory\cloudflared.exe" access ssh --hostname %h IdentityFile "~/.cloudflared/vm.example.com-cf_key" CertificateFile "~/.cloudflared/vm.example.com-cf_key-cert.pub"
方法2:用bat脚本封装命令
创建一个不含空格路径的批处理脚本,封装带空格路径的cloudflared命令,再在exec中调用这个脚本:
- 新建
cloudflared-ssh-gen.bat,放在无空格目录(比如C:\tools),内容如下:@echo off "C:\Users\User Name\Project Directory\cloudflared.exe" access ssh-gen --hostname %1 - 修改SSH配置:
Match host vm.example.com exec "C:\tools\cloudflared-ssh-gen.bat %h" HostName vm.example.com ProxyCommand "C:\Users\User Name\Project Directory\cloudflared.exe" access ssh --hostname %h IdentityFile "~/.cloudflared/vm.example.com-cf_key" CertificateFile "~/.cloudflared/vm.example.com-cf_key-cert.pub"
方法3:迁移cloudflared到无空格目录
直接将cloudflared.exe复制到不含空格的目录(比如C:\cloudflared),这样路径无需引号即可被exec识别:
Match host vm.example.com exec "C:\cloudflared\cloudflared.exe access ssh-gen --hostname %h" HostName vm.example.com ProxyCommand "C:\cloudflared\cloudflared.exe" access ssh --hostname %h IdentityFile "~/.cloudflared/vm.example.com-cf_key" CertificateFile "~/.cloudflared/vm.example.com-cf_key-cert.pub"
补充说明
ProxyCommand等指令支持引号包裹路径,是因为OpenSSH单独处理了这些指令的路径解析;而Match exec是直接将命令交给Windows的cmd.exe执行,cmd对嵌套引号的解析存在限制,因此上述方法通过绕开嵌套引号的方式解决问题。
内容的提问来源于stack exchange,提问作者loner_code_monkey
相关产品推荐
相关产品推荐

