C# - 使用StandardInput和StandardOutput对交换机运行命令并读取/响应结果

时间:2017-10-27 01:24:32

标签: c#

我知道这与我对使用流的有限理解有关,所以任何有助于巩固我在这方面的知识的方向都会有所帮助。

我正在使用终端进程将plink命令和SSH发送到我的交换机中。我知道这不是最有说服力的方式,但这就是我现在所拥有的(我无法弄清楚如何让SSHNet在一个会话中对交换机运行多个命令)。我的主要问题是我正在尝试向交换机运行多个命令并对输出作出反应。例如,在创建cmd.exe进程并登录后,我发送以下命令:

cmd.StandardInput.WriteLine(“sh version | i cat3k_caa-univeralk”);

我想获取该命令的输出并对其执行某些操作,特别是将结果写入我拥有的richtextbox,如果版本看起来不正确,则在响应时针对交换机运行另一个命令,将结果写入richtextbox,然后继续向交换机发送命令,直到我完成,允许来回,读取交换机的输出,然后写回交换机。

然而,每次我试图用以下的方式尝试这个:

while (!cmd.StandardOutput.EndOfStream)
{ do stuff here }

然后尝试尝试响应命令,甚至尝试下一个命令,如:

cmd.StandardInput.WriteLine(“sh version | i Configuration register”);

它永远不会到达那里,它只是挂在上一次从输出命令读取而不会继续。我有一种感觉它与使用异步命令或我应该使用它们有关,但我查看了Microsoft文档,它并没有点击我的脑海中我应该如何使用它。

这是我的代码片段,因此您可以更好地了解我正在做的事情。任何让我理解这应该如何工作的帮助都会让我非常感激。

 private void connectBtn_Click(object sender, EventArgs e)
        {
            consoleRichTxtBx.Clear();

            Process cmd = new Process();
            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\PuTTY\\";
            cmd.Start();

            this.Text = GetDNSNameFromIP(cmd).ToUpper();
            cmd.Close();

            cmd.Start();
            cmd.StandardInput.WriteLine("plink " + ipTxtBx.Text + " -ssh -l " + usrTxtBx.Text + " -pw " + pwdTxtBx.Text);
            cmd.StandardInput.WriteLine("ter len 0");
            cmd.StandardInput.WriteLine("sh version | i cat3k_caa-universalk");
            checkVersionNumber(cmd);
            cmd.StandardInput.WriteLine("sh version | i Configuration register");
            cmd.StandardInput.WriteLine("sh run | i scp server");
            more commands and parsing stuff;

我正在尝试读取输出的checkVersionNumber方法的代码:

private void checkVersionNumber(Process cmd)
        {
            while (!cmd.StandardOutput.EndOfStream)
            {
                string lineread = cmd.StandardOutput.ReadLine();
                doing stuff with output
            }
        }

感谢您提供的任何帮助/见解。

0 个答案:

没有答案