【问题标题】:Renci SSH C#, open a client in Rpi and send commands using that client [duplicate]Renci SSH C#,在 Rpi 中打开一个客户端并使用该客户端发送命令 [重复]
【发布时间】:2020-02-06 21:15:44
【问题描述】:

我正在寻找一种方法来帮助我 ssh 在树莓派中打开一个二进制客户端并在该客户端中发送一些命令。我尝试了两种方法:

  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();
        }

感谢您的帮助。

【问题讨论】:

  • WaitForExit 后您是否排队?添加一个断点,看看你是否到达断点。我认为你永远不会有出口。
  • @jdweng 是的,你是对的。 sc.EndExecute(异步执行);没完没了,我猜是因为当它运行客户端时,ssh 什么都做不了。
  • 这是 cmd.exe 的行为方式。该应用程序可能使命令窗口保持打开状态,因此在窗口关闭之前您不会退出。当进程完成时,它可能会在标准输出(进程标准输入)上发送一条消息。因此,如果您将异步流连接到 ReddirectStandard 输入,您可以在收到提示或消息时确定该过程何时结束。
  • @jdweng 感谢您的解释。问题是我需要使用该应用程序执行一些命令。目前,ssh 只能帮助我在 RPi 中打开和运行该应用程序,但我正在寻找一种方法来完成剩下的过程。我认为 ssh 也可以向该应用程序发送命令。

标签: c# ssh raspberry-pi client


【解决方案1】:

我刚刚找到了解决问题的方法 :) 对于这种情况,只需使用 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

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多