【发布时间】: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