在C#中捕获Plink输出

时间:2015-01-22 15:57:09

标签: c# io putty plink

我正在尝试使用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来访问它。我想在我的程序中复制这个动作。

1 个答案:

答案 0 :(得分:2)

您的代码中有许多错误:

  • 您正在重定向输出,而您没有阅读/处理/打印它(这就是为什么"没有显示任何内容"
  • 通过&#34运行plink;输入" plinkcmd.exe是疯了。您可以直接运行plink,完全避免cmd.exe(即使您需要使用cmd.exe,也应该在命令行上将plink.exe传递给它/c path\plink.exe:{{ 1}})。不,直接运行不会导致Plink 立即关闭
  • 一旦输出缓冲区填满,调用WaitForExit()而不读取重定向的输出将使代码死锁。请参阅ProcessStartInfo.RedirectStandardOutput备注部分。或者,使用process.StandardOutput.ReadToEnd()(它类似于WaitForExit,但也会读取输出)。它实际上是MSDN在上一个链接中推荐的内容。
  • 如果你打算只使用Plink执行一个命令,那么最好在Plink命令行上传递命令,而不是"输入"它到(重定向)输入:

    plink.exe -ssh user@host command
    

另见Testing using Plink.exe to connect to SSH in C#的答案