处理不重定向完整输出;没有显示SSH服务器的完整响应

时间:2013-05-17 04:05:28

标签: c# process plink

我正在启动一个进程,并利用plink创建一个到我本地网络中的ssh的反向隧道。

我可以很好地连接到服务器,但是它没有在控制台窗口上显示完整内容,我的目标是等待所有内容显示,然后使用process.standardInput输入密码继续。

我应该在控制台窗口收到这个:

Using username "dayan".
Passphrase for key "rsa-key-20130516":

但我收到第一行:

Using username "dayan".

如果我按回车键,它确实为我提供了“密码错误错误”,但我从未看到“密钥rsa-key的密码短语......” < / p>

另请注意,我确实输入了正确的密码并且控制台仍然是空白的,但是在装有SSH服务器的Linux shell上,我运行了who命令并注意到我已成功连接。

这可能是什么问题?

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = Path.Combine(BinPath, "plink.exe");

processInfo.Arguments = 
String.Format(@" {0} {1}:127.0.0.1:{2} -i {3} -l {4} {5}", 
remoteOption, LocalPort, TargetPort, KeyPath, username, TargetIp);

processInfo.UseShellExecute = false;
processInfo.CreateNoWindow = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardInput = true;
processInfo.RedirectStandardError = true;

Process process = Process.Start(processInfo);
StreamReader output = process.StandardOutput;

while (!output.EndOfStream) {
    string s = output.ReadLine();
    if (s != "")
        Console.WriteLine(s);
}

process.WaitForExit();
process.Close();

1 个答案:

答案 0 :(得分:1)

用户名将在此处提交:

processInfo.Arguments = 
String.Format(@" {0} {1}:127.0.0.1:{2} -i {3} -l {4} {5}", 
remoteOption, LocalPort, TargetPort, KeyPath, username, TargetIp);

因此,当您开始此过程时,plink仍会将用户名作为输入处理,并将一行返回process.StandardOutput

现在它等待密码但不结束该行,因此string s = output.ReadLine();不匹配程序提交的实际输出。

尝试改为读取输出的每个字节:

  var buffer = new char[1];
  while (output.Read(buffer, 0, 1) > 0)
  {
       Console.Write(new string(buffer));
  };

这也会捕获CR + LF,所以你不必提,如果输出必须添加一个新行。 如果你想手动处理CR + LF(特别是解析一个特定的行),你可以将缓冲区添加到一个字符串,只发送它,如果你找到"\r"":"左右的话:

  var buffer = new char[1];
  string line = "";
  while (process.StandardError.Read(buffer, 0, 1) > 0)
  {
      line += new string(buffer);

      if (line.Contains("\r\n") || (line.Contains("Passphrase for key") && line.Contains(":")))
      {
         Console.WriteLine(line.Replace("\r\n",""));
         line = "";
      }
  };