gpt4 book ai didi

c# - 使用 C# 捕获执行 plink 的 cmd 的所有(stdout、stderr 和 CON)输出(std out+err ok,CON 不工作)

转载 作者:太空狗 更新时间:2023-10-29 20:11:15 40 4
gpt4 key购买 nike

我想通过打开一个进程并运行 plink 从 c# 打开 SSH 连接。应收集所有输出,并根据结果,程序将触发对 ssh 的操作。我的大问题是,我正在使用几个不同的脚本并且我需要(自动)用户交互。因此我必须捕获所有输出数据(标准输出、标准错误和控制台)。

查看以下测试批处理应该会使情况更加清楚:

1: @ECHO OFF
2: ECHO StdOut
3: ECHO StdErr 1>&2
4: ECHO Cons>CON

代码如下:

Process process;
Process process;
process = new Process();
process.StartInfo.FileName = @"cmd.exe";
process.StartInfo.Arguments = "/c test.bat";
process.StartInfo.UseShellExecute = false;
process.StartInfo.ErrorDialog = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
StreamWriter inputWriter = process.StandardInput;
[...]

我能够捕获第 2+3 行,但不能捕获第 4 行(某些程序使用)。我也尝试过 powershell(或直接 plink)而不是 cmd.exe 作为起点,但结果相同。

在 c# 中是否有任何方法也可以捕获控制台,或者您知道任何第三方命令行能够将 CON 重定向到 stdout 或类似的东西吗?

最佳答案

我不确定这是否可能 - 好吧至少不使用一些简单的 API。

请注意,我没有在网络上找到(虽然我尝试过)任何直接证实的信息,但我是这样得出这个结论的。

Windows 中的控制台是它自己的子系统,由 csrss.exe 管理(从 Windows Vista 开始还有 conhost.exe,但我离题了)。它有自己的一组 API(AttachConsoleWriteConsole 等),每个进程只能有一个“控制台”。

另一方面,

CMD.EXE 只是另一个控制台模式应用程序,它恰好使用控制台并在控制台窗口中启动。您可以通过启动不同的控制台模式应用程序并观察进程树来观察这种效果,例如Process Explorer:没有 CMD.EXE 父进程(而是 Explorer 或您用来启动它的任何东西 - 当然包括 CMD.EXE)。

到目前为止,我一直在尝试展示“控制台”与 CMD.EXE、批处理文件或一般控制台模式应用程序之间的区别。

因此,当您在 CMD.EXE 中使用 > CON 时,您实际上会产生与在 native 中写入 CONOUT$ 相同的效果应用程序(或您在类 UNIX 操作系统上对 /dev/console 的典型写入)。托管代码似乎没有直接等效项,因为 Console.OutConsole.Error 等于 stdoutstderr 在 native 应用程序中(或 12 作为 CMD.EXE 中的文件描述符)。

综上所述,当您启动一个进程时,您只能重定向它的标准输出和标准错误流,但不能(本身)重定向它写入控制台的消息(或 CONOUT$句柄)。我想这与尝试将进程写入某个文件的输出重定向是一样的,这也是(通常)不可能的。

您可以使用一些 Hook 或在子进程中注入(inject)一些东西来获取控制台输出来实现这一点。

无法轻松做到这一点,也是(其中之一)为什么编写一个完整的终端(即控制台窗口,而不是 CMD.EXE!)替代 Windows 的原因不是很容易实现,需要一些技巧或解决方法。

关于c# - 使用 C# 捕获执行 plink 的 cmd 的所有(stdout、stderr 和 CON)输出(std out+err ok,CON 不工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968244/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com