如何在C#中的SSH服务器上运行命令?

我需要使用C#代码执行此操作:

  1. 在后台打开putty.exe(这就像一个cmd窗口)
  2. 使用其IP地址登录远程主机
  3. 输入用户名和密码
  4. 一个接一个地执行几个命令。
  5. 运行另一个命令,获取响应,告诉我在成功执行之前运行的命令

所以我试着这样做:

ProcessStartInfo proc = new ProcessStartInfo() { FileName = @"C:\putty.exe", UseShellExecute = true, //I think I need to use shell execute ? RedirectStandardInput = false, RedirectStandardOutput = false, Arguments = string.Format("-ssh {0}@{1} 22 -pw {2}", userName, hostIP, password) ... //How do I send commands to be executed here ? }; Process.Start(proc); 

您可以尝试https://sshnet.codeplex.com/ 。 有了它,你根本不需要腻子或窗户。 你也可以得到回复。 它会看起来…… 像这样。

 SshClient sshclient = new SshClient("172.0.0.1", userName, password); sshclient.Connect(); SshCommand sc= sshclient .CreateCommand("Your Commands here"); sc.Execute(); string answer = sc.Result; 

编辑:另一种方法是使用shellstream。

创建一个ShellStream,如:

 ShellStream stream = sshclient.CreateShellStream("customCommand", 80, 24, 800, 600, 1024); 

然后你可以使用这样的命令:

  public StringBuilder sendCommand(string customCMD) { StringBuilder answer; 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; } 

虽然@LzyPanda的答案是有效的,但是使用SSH“shell”通道( SshClient.CreateShellStream ),只允许交互式终端,不是自动执行命令的好主意。 你会从中获得很多副作用,比如命令提示,ANSI序列,某些命令的交互行为等。

对于自动化,请使用SSH“exec”通道( SshClient.CreateCommand ):

 using (var command = ssh.CreateCommand("command")) { Console.Write(command.Execute()); } 

如果需要执行多个命令,请重复上述代码。 您可以为一个SSH连接创建任意数量的“exec”通道。

虽然如果命令相互依赖(第一个命令修改了环境,例如后面命令使用的变量),您可以在一个通道中执行它们。 使用shell语法,例如&&;

 using (var command = ssh.CreateCommand("command1 && command2")) { Console.Write(command.Execute()); } 

如果需要连续读取命令输出,请使用:

 using (var command = ssh.CreateCommand("command")) { var asyncExecute = command.BeginExecute(); command.OutputStream.CopyTo(Console.OpenStandardOutput()); command.EndExecute(asyncExecute); } 

您还可以使用ExtendedOutputStream ,它包含stdout和stderr。 请参阅SSH.NET实时命令输出监视 。


不幸的是,SSH.NET中“exec”通道的实现不允许certificate命令的输入。 对于该用例,您将需要求助于“shell”通道,直到此限制得到解决。