在 C# 中捕获 Plink 输出

Capturing Plink output in C#

我正在尝试使用 Plink 访问计算机上的信息。我遵循了本教程:
http://www.mindfiresolutions.com/Creating-a-SSH-connection-using-plink-PuTTY-via-C-application-1760.ph

到目前为止,我只使用我的程序来打开 Plink,我将添加登录信息等,一旦我至少可以让 Plink 在我的程序中打开。我有这个基于教程:

ProcessStartInfo psi = new ProcessStartInfo(@"C:\Windows\System32\cmd");
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
psi.CreateNoWindow = false;

Process process = Process.Start(psi);
Thread.Sleep(3000);
string cmdForTunnel = "plink";
process.StandardInput.WriteLine(cmdForTunnel);
process.WaitForExit();
Thread.Sleep(10000);

//DoBusinessLogic();
process.StandardInput.WriteLine("logout");
Thread.Sleep(10000);

if (process.HasExited)
{
    process.Close();
    process.Dispose();
}

但是没有任何显示,这让我很困扰。命令 plink 应该显示有关如何使用该程序的帮助信息(稍后我将用更有用的内容替换该命令),但命令提示符仍然是空的。我还尝试将 plink 替换为 ipconfig,但也没有显示任何内容。

我知道如何自己打开 cmd 并输入 plink 来访问它。我想在我的程序中复制这个动作。

你的代码有很多错误:

  • 您正在重定向输出,而您不是 reading/processing/printing 它(这就是为什么 "nothing is displayed"
  • 运行 plink 从 "typing" plinkcmd.exe 太疯狂了。您可以直接 运行 plink,完全避免 cmd.exe(即使您需要使用 cmd.exe,您也应该通过命令将 plink.exe 传递给它-行:/c path\plink.exe)。不,直接 运行 不会导致 Plink 立即关闭 .
  • 在不读取重定向输出的情况下调用 WaitForExit() 将使您的代码在输出缓冲区填满后死锁。请参阅 Remarks 部分以了解 ProcessStartInfo.RedirectStandardOutput. Alternatively, use process.StandardOutput.ReadToEnd()(类似于 WaitForExit,但也会读取输出)。其实就是之前MSDN推荐的link.
  • 如果你打算只执行一个命令,使用 Plink,最好在 Plink 命令行上传递命令,而不是 "typing" 它到它的(重定向的)输入:

    plink.exe -ssh user@host command
    

另请参阅对 Testing using Plink.exe to connect to SSH in C#

的回答