进程不重定向完整输出;没有显示来自SSH服务器的完整响应
本文关键字:SSH 服务器 响应 显示 重定向 输出 进程 | 更新日期: 2023-09-27 18:13:56
我正在启动一个进程,并使用plink
创建一个反向隧道到我的本地网络中的ssh。
我可以很好地连接到服务器,但它没有在控制台窗口上显示完整的内容,我的目标是等待一切显示,然后通过使用process.standardInput
输入密码继续。
我应该在控制台窗口收到这个:
Using username "dayan".
Passphrase for key "rsa-key-20130516":
但是我只收到第一行:
Using username "dayan".
如果我按enter键,它确实为我提供了"不正确的密码错误"但我从来没有看到"密钥rsa-key....的Passphrase "
还请注意,我确实输入了正确的密码,控制台保持空白,但在持有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();
用户名已经在这里提交了:
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+LFs(参见。解析特定的行),您可以将缓冲区添加到字符串中,并且仅在发现"'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 = "";
}
};