我正在启动一个进程,并利用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();
答案 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 = "";
}
};