" StandardOut尚未重定向或流程尚未开始"在C#中读取控制台命令输出时

时间:2016-06-08 06:11:16

标签: c# ssh plink

感谢@ user2526830代码。基于该代码,我在程序中添加了几行,因为我想读取SSH命令的输出。以下是我的代码,它在第while

处给出错误
  

StandardOut尚未重定向或该流程尚未启动。

我想要实现的是我想将ls的输出读成字符串。

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:\plink.exe";
startinfo.Arguments = "-ssh abc@x.x.x.x -pw abc123";
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp");
process.StandardInput.WriteLine("exit");

process.StartInfo.RedirectStandardOutput = true;

while (!process.StandardOutput.EndOfStream)
{
    string line = process.StandardOutput.ReadLine();
}

process.WaitForExit();
Console.ReadKey();

2 个答案:

答案 0 :(得分:20)

在开始此过程之前尝试设置标准输出重定向。

process.StartInfo.RedirectStandardOutput = true;
process.Start();

答案 1 :(得分:1)

当您尝试读取输出时,可能是该过程已经终止(对于您的"退出"命令)。尝试下面稍微修改过的版本,我在" ls"之后移动你的while循环。命令但在"退出"之前命令。

它应该读取你的" ls"的输出。命令很好,但不幸的是很可能会在某些时候挂起,因为你永远不会在StandardOutput上得到EndOfStream。当没有其他内容可读时,ReadLine将阻塞,直到它可以读取另一行。

因此,除非您知道如何检测命令生成的输出的最后一行并在读取后断开循环,否则您可能需要使用单独的线程进行读取或写入。

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:\plink.exe";
startinfo.Arguments = "-ssh abc@x.x.x.x -pw abc123";
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp");

while (!process.StandardOutput.EndOfStream)
{
    string line = process.StandardOutput.ReadLine();
}

process.StandardInput.WriteLine("exit");
process.WaitForExit();
Console.ReadKey();