Saltar al contenido

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

Posterior a de una larga selección de datos solucionamos esta contrariedad que pueden tener muchos usuarios. Te brindamos la respuesta y deseamos servirte de gran ayuda.

Solución:

Puede probar https://sshnet.codeplex.com/. Con esto no necesitarías masilla o una ventana en absoluto. También puede obtener las respuestas. Se vería algo. como 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, usando un canal SSH “shell” (SshClient.CreateShellStream), y mucho menos una terminal interactiva, no es una buena idea para automatizar la ejecución de comandos. Obtiene muchos efectos secundarios de eso, como indicaciones de comando, secuencias ANSI, comportamiento interactivo de algunos comandos, etc.

Para la automatización, use un canal SSH “ejecutivo” (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 “ejecutivos” para una conexión SSH.

Aunque si los comandos dependen unos de otros (el primer comando modificó el entorno, por ejemplo, las variables que utilizan los últimos comandos), debe ejecutarlos dentro de un canal. Use una sintaxis de shell para eso, como && o ;:

using (var command = ssh.CreateCommand("command1 && command2"))

    Console.Write(command.Execute());

Si necesita leer continuamente la salida de los comandos, use:

using (var command = ssh.CreateCommand("command"))

    var asyncExecute = command.BeginExecute();
    command.OutputStream.CopyTo(Console.OpenStandardOutput());
    command.EndExecute(asyncExecute);

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


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

valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *