如何在C#执行pscp命令时自动回应确认提示为Yes?
解决C#执行pscp自动回复确认提示的问题
我来帮你搞定这个自动回复pscp确认的需求!你在批处理里用echo y |的思路是对的——本质是把"y"作为标准输入传递给pscp,在C#里我们只需要对进程的标准输入做同样的操作就行,下面是具体的修改方案:
核心修改点
你的现有代码已经重定向了标准输出,但还需要启用标准输入重定向,然后往pscp的输入流里写入"y"(加上换行符模拟回车)。另外还要注意等待进程执行完成,确保输入被正确处理。
修改后的完整代码
首先调整ExecuteCopyCerts函数:
public Boolean ExecuteCopyCerts(string fileName, string arguments) { txtLiveHubStatus.Text = ""; try { System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(fileName, arguments); procStartInfo.RedirectStandardOutput = true; // 新增:启用标准输入重定向 procStartInfo.RedirectStandardInput = true; procStartInfo.UseShellExecute = false; procStartInfo.CreateNoWindow = true; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo = procStartInfo; proc.Start(); // 关键:往pscp的标准输入写入"y"并回车,模拟手动确认 proc.StandardInput.WriteLine("y"); // 关闭输入流,告诉pscp没有更多输入了 proc.StandardInput.Close(); string result = proc.StandardOutput.ReadToEnd(); // 等待进程执行完成,确保所有操作都完成 proc.WaitForExit(); return proc.ExitCode == 0; } catch (Exception ex) { // 添加异常处理,更新状态文本提示错误 txtLiveHubStatus.Text = $"执行出错:{ex.Message}"; return false; } }
然后调整调用代码的参数(注意路径的转义问题,建议用@前缀避免转义错误):
// 用@前缀避免路径里的转义字符问题,或者用双反斜杠\\ string pscpArgs = @" -batch -pw password E:\Certs\client.conf me@<ip>:/home/user"; ExecuteCopyCerts("pscp.exe", pscpArgs);
额外说明
-batch参数本身是让pscp在非交互模式下运行,但第一次连接新主机时,它还是会弹出确认主机密钥的提示,这时候就需要我们手动输入"y"来确认,这也是为什么需要写入输入流的原因。- 如果你遇到路径解析错误,一定要检查字符串里的反斜杠——C#里
\是转义字符,所以要么用\\,要么用@前缀的字符串。
内容的提问来源于stack exchange,提问作者AShah
相关产品推荐
相关产品推荐

