ssh在c中读取console命令输出时,“standardout尚未重定向或进程尚未启动”#

ttcibm8c  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(570)

感谢@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();
sirbozc5

sirbozc51#

在启动进程之前,请尝试设置标准输出重定向。

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

mpgws1up2#

当您尝试读取输出时,进程可能已经终止(由于您的“exit”命令)。尝试下面稍微修改的版本,我将while循环移到“ls”命令之后,但移到“exit”命令之前。
它应该可以很好地读取“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();

相关问题