Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:等待命令完全执行_C#_Ssh - Fatal编程技术网

C#:等待命令完全执行

C#:等待命令完全执行,c#,ssh,C#,Ssh,从C#代码连接到远程unix服务器后,我尝试执行命令提示行。我已经使用了下面的代码,这是工作。但是,我希望在执行下一个命令行之前完全执行这些命令。目前,行的执行速度更快,因此,我得到的结果是错误的 每个命令应完成处理,然后移动到下一个命令。 在我的C#web应用程序中,我在按钮单击事件上有以下代码 SshClient sshclient = new SshClient(hostname, username, pwd); sshclient.Connect(); ShellStream s

从C#代码连接到远程unix服务器后,我尝试执行命令提示行。我已经使用了下面的代码,这是工作。但是,我希望在执行下一个命令行之前完全执行这些命令。目前,行的执行速度更快,因此,我得到的结果是错误的

每个命令应完成处理,然后移动到下一个命令。 在我的C#web应用程序中,我在按钮单击事件上有以下代码

SshClient sshclient = new SshClient(hostname, username, pwd);
  sshclient.Connect();
  ShellStream stream = sshclient.CreateShellStream("cmsd", 80, 24, 800, 600, 1024);
objclass.sendCommand("command1", stream).ToString();
 objclass.sendCommand("command2", stream).ToString();
类文件包含以下方法:

public StringBuilder  sendCommand(string customCMD, ShellStream stream)
        {
            StringBuilder answer = new StringBuilder();
            answer.Clear();
            var reader = new StreamReader(stream);
            var writer = new StreamWriter(stream);
            writer.AutoFlush = true;
            WriteStream(customCMD, writer, stream);
            answer = ReadStream(reader);
            return answer;           
        }    

        private void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
        {
            writer.WriteLine(cmd);
            while (stream.Length == 0)
            {
                Thread.Sleep(500);
            }
        }

        private StringBuilder ReadStream(StreamReader reader)
        {
            StringBuilder result = new StringBuilder();
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                result.AppendLine(line);
            }
            return result;
        }
//尝试新代码

public StringBuilder sendCommand(string customCMD, ShellStream stream)
        {
            StringBuilder answer = new StringBuilder();
            answer.Clear();
            answer.Length = 0;            

            var reader = new StreamReader(stream);
            var writer = new StreamWriter(stream);
            writer.AutoFlush = true;

            while (!stream.DataAvailable)
            {
                WriteStream(customCMD, writer, stream);
                Thread.Sleep(5000);
            }

            answer = ReadStream(reader);

            return answer;

        }

您可以尝试类似以下代码的操作:

using (var client = new SshClient(hostname, username, pwd))
{
    client.Connect();
    var cmd = client.CreateCommand("sleep 15s;echo 123");
    var asynch = cmd.BeginExecute();
    while (!asynch.IsCompleted)
    {
         //  Waiting for command to complete...
         Thread.Sleep(2000);
    }
    result = cmd.EndExecute(asynch);
    client.Disconnect();
}

您可以尝试类似以下代码的操作:

using (var client = new SshClient(hostname, username, pwd))
{
    client.Connect();
    var cmd = client.CreateCommand("sleep 15s;echo 123");
    var asynch = cmd.BeginExecute();
    while (!asynch.IsCompleted)
    {
         //  Waiting for command to complete...
         Thread.Sleep(2000);
    }
    result = cmd.EndExecute(asynch);
    client.Disconnect();
}

我无法将参数视为BeginExecute。我可以看到Begin.expected您在SshClient中使用哪个名称空间?我尝试了Renci.SshNet名称空间,它给出了BeginExecute方法。但我现在记不起来了,我从nuget安装了Renci.SshNet.Async包,它在引用中添加了Renci.SshNet和Renci.SshNet.Async名称空间。可能您可以尝试安装Renci.SshNet.async,但还没有。我在原来的帖子中添加了一个新代码。如果这有助于解决这个问题,请您回顾一下。问题是我需要等待提示符移动到下一个空提示符,然后读取数据并显示在浏览器UI中,然后写入下一条命令。我无法将参数视为BeginExecute。我可以看到Begin.expected您在SshClient中使用哪个名称空间?我尝试了Renci.SshNet名称空间,它给出了BeginExecute方法。但我现在记不起来了,我从nuget安装了Renci.SshNet.Async包,它在引用中添加了Renci.SshNet和Renci.SshNet.Async名称空间。可能您可以尝试安装Renci.SshNet.async,但还没有。我在原来的帖子中添加了一个新代码。如果这有助于解决这个问题,请您回顾一下。问题是我需要等待提示符移动到下一个空提示符,然后读取数据并显示在浏览器UI中,然后编写下一个命令