首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Renci SSH C#,在Rpi中打开客户端并使用该客户端发送命令。

Renci SSH C#,在Rpi中打开客户端并使用该客户端发送命令。
EN

Stack Overflow用户
提问于 2020-02-06 10:15:55
回答 1查看 1K关注 0票数 0

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

代码语言:javascript
运行
复制
  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正在运行,但它不会做进一步的操作。我也在尝试这样做,并得到了同样的结果:

代码语言:javascript
运行
复制
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();
        }

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-06 13:15:44

我刚刚找到了一种解决问题的方法:)在这种情况下,只需使用CreateShellStream和StreamReader/StreamWriter来达到这个目的。

代码语言:javascript
运行
复制
            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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60092555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档