You need to enable JavaScript to run this app. C#通过Process.Start启动批处理时无法找到Win10自带OpenSSH的ssh.exe问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C#通过Process.Start启动批处理时无法找到Win10自带OpenSSH的ssh.exe问题咨询

问题成因

你观察到的目录可见性差异,本质是Windows WOW64 体系下的32位/64位文件系统重定向机制导致的:

  • 当你的C#应用被编译为32位架构(x86,或是勾选了*“首选32位”*选项的AnyCPU配置),它启动的所有子进程(包括用来执行批处理的cmd.exe)都会继承32位进程的运行环境。
  • 在32位进程环境下,系统会自动拦截所有对C:\Windows\System32\路径的访问,将其重定向到32位程序专属的系统目录C:\Windows\SysWOW64\。系统自带的64位OpenSSH客户端只存放在真实的64位System32路径下,SysWOW64目录中不会同步该文件夹——所以批处理执行dir c:\Windows\System32\时,实际读取的是SysWOW64的目录内容,自然看不到OpenSSH文件夹、也无法找到内部的ssh.exe。
  • 资源管理器、直接从开始菜单/运行启动的cmd.exe都是原生64位程序,不存在重定向拦截,所以双击批处理时能正常看到System32下的OpenSSH目录、运行ssh命令。
解决方案

可根据实际项目需求选择对应处理方式:

  • 修改C#应用的编译配置:将目标架构调整为x64,或是取消AnyCPU配置下的*“首选32位”*勾选,让应用本身运行在64位环境。这种情况下启动的批处理、cmd子进程都会是64位版本,可直接正常访问真实System32下的OpenSSH路径,无需额外修改批处理代码。
  • 如果项目必须保留32位架构兼容,可绕开硬编码的System32路径,使用系统为32位进程预留的虚拟路径访问64位系统目录:将批处理中ssh.exe的路径从c:\Windows\System32\OpenSSH\ssh.exe替换为c:\Windows\Sysnative\OpenSSH\ssh.exe。Sysnative是Windows专门预留的虚拟路径,不会被重定向机制拦截,可直接指向真实的64位System32目录。
  • 批处理可增加路径兜底逻辑适配多环境,避免不同部署场景下路径找不到的问题:
@echo off
REM 自动匹配可用的ssh.exe路径
if exist "%SystemRoot%\Sysnative\OpenSSH\ssh.exe" (
    set "SSH_EXE=%SystemRoot%\Sysnative\OpenSSH\ssh.exe"
) else (
    set "SSH_EXE=%SystemRoot%\System32\OpenSSH\ssh.exe"
)
REM 后续调用ssh时直接引用变量即可
"%SSH_EXE%" 传入你的SSH连接参数

内容的提问来源于stack exchange,提问作者André

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 06:36:05