¿Cómo ejecutar comandos en el servidor SSH en C #?

Necesito ejecutar esta acción usando un código C #:

  1. abra putty.exe en el fondo (esto es como una ventana de cmd)
  2. iniciar sesión en un host remoto usando su dirección IP
  3. Introduzca un nombre de usuario y contraseña
  4. ejecutar varios comandos uno después del otro.
  5. ejecutar otro comando que obtiene una respuesta diciéndome que los comandos que ejecuté antes que donde se ejecutó con éxito

Así que estoy tratando de hacerlo así:

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

Puede intentar https://sshnet.codeplex.com/ . Con esto no necesitarías masilla o una ventana en absoluto. Puedes obtener las respuestas también. Se vería así. Me gusta esto.

 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; 

Editar: Otro enfoque sería usar un shellstream.

Crea un ShellStream una vez como:

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

Entonces puedes usar un comando como este:

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

Si bien la respuesta de @LzyPanda funciona, usar un canal SSH “shell” ( SshClient.CreateShellStream ), dejar solo un terminal interactivo, no es una buena idea para automatizar la ejecución de comandos. Obtienes muchos efectos colaterales, como avisos de comando, secuencias ANSI, comportamiento interactivo de algunos comandos, etc.

Para la automatización, use un canal SSH “exec” ( SshClient.CreateCommand ):

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

Si necesita ejecutar varios comandos, repita el código anterior. Puede crear cualquier cantidad de canales “exec” para una conexión SSH.

Aunque si los comandos dependen el uno del otro (el primer comando modificó el entorno, por ejemplo, las variables que utilizan los últimos comandos), los ha ejecutado dentro de un canal. Use una syntax de shell para eso, como && or ; :

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

Si necesita leer continuamente los comandos de salida, use:

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

También puede usar ExtendedOutputStream , que contiene tanto stdout como stderr. Consulte la supervisión de salida de comandos en tiempo real de SSH.NET .


Lamentablemente, la implementación del canal “exec” en SSH.NET no permite probar una entrada al comando. Para ese caso de uso, deberá recurrir al canal “shell” hasta que se resuelva esta limitación.