Renci SSH C#,在Rpi中打开一个客户端,然后使用该客户端发送命令

时间:2020-02-06 10:15:55

标签: c# ssh raspberry-pi client

我正在寻找一种方法来帮助我ssh在raspberry pi中打开一个二进制客户端,并在该客户端中发送一些命令。我尝试2种方法:

  SshClient sshclient = new SshClient(HostAddress, "pi", "raspberry");

  sshclient.Connect();

  using (SshCommand sc = sshclient.CreateCommand(
"rm /tmp/liblog.txt; 
 cd /home/pi; 
 sudo ./myClient -s ffdd::aabb:3; 
 setdefault; 
 exit"))
            {               
                var asyncExecute = sc.BeginExecute();
                sc.OutputStream.CopyTo(Console.OpenStandardOutput());

                Delay(60000);
                sc.EndExecute(asyncExecute);
            }
  sshclient.Disconnect();
  sshclient.Dispose();

如您所见,我这里有5个命令,在运行myClient之前ssh进程可以正常工作。但是当客户端运行时,下一个命令不再执行。 myClient正在运行,但未执行其他操作。我也在尝试这种方式,并得到相同的结果:

public void runMyClient(string HostAddress)
        {
            string command = " /nointeractiveinput /command \"open " + HostProtocol + "://" + HostLogin + "@" + HostAddress +
                "/\" \"call cd /home/pi/\"" +
                " \"call ./myClient -s ffdd::aabb:3"" +
                " \"call setdefault\"";

            Console.WriteLine(command);

            System.Diagnostics.Process cmd = new System.Diagnostics.Process();
            cmd.StartInfo.FileName = "\"C:\\Program Files (x86)\\WinSCP\\WinSCP.com\"";
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.Arguments = command;

            cmd.Start();
            Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            cmd.WaitForExit();
            cmd.StandardInput.Close();
            cmd.Close();
        }

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决我的问题的方法:) 对于这种情况,只需使用CreateShellStream和StreamReader / StreamWriter即可达到此目的。

            SshClient sshclient = new SshClient(HostAddress, "pi", "raspberry");
            sshclient.Connect(); 

            string default_set_status_done = "DEFAULT_SET_DONE";
            string default_set_status_failed = "DEFAULT_SET_FAIL";
            var s = sshclient.CreateShellStream("Commands", 240, 200, 132, 80, 1024);

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

            // Do the read command
            writer.WriteLine("rm /tmp/liblog.txt");
            Thread.Sleep(200);
            writer.WriteLine("cd /home/pi/");
            Thread.Sleep(200);
            writer.WriteLine("sudo ./myClient -s ffdd::aabb:3");
            Thread.Sleep(200);
            writer.WriteLine("setdefault");
            Thread.Sleep(30000);
            writer.WriteLine("exit");
            Thread.Sleep(10000);

            string l = "";
            while ((l = reader.ReadLine()) != null)
            {
                Console.WriteLine(l);
                if (l.Contains(default_set_status_done))
                {
                    ReportService.LogOk("set default completed.");
                }
                else if (l.Contains(default_set_status_failed))
                {
                    Inconclusive("set default failed!");
                }                
            }

这对我有用。 您可以在这里找到更多参考:https://csharp.hotexamples.com/examples/Renci.SshNet/SshClient/CreateShellStream/php-sshclient-createshellstream-method-examples.html

相关问题