2010-09-04 29 views
9

Tenga en cuenta que esto tiene que ser en una caja de ventanas como lo estoy usando C# para acceder a la información acerca de las ventanasme gustaría ejecutar un comando a través de ssh de una caja de Windows que se ejecuta utilizando C#

(Necesito información tanto un cuadro de Windows y un cuadro de Linux, y creo que hacer un programa/script que se ejecute sin GUI y acceder a Windows desde un cuadro de Linux sin la intervención del usuario sería más difícil, si esto no es cierto, dime, me encantaría hacer Haz que esto se ejecute en * nix con solo la parte que accede a la información de Windows que se ejecuta en Windows.

Hay una buena C# api para obtener esta información de windows, en * nix es lo suficientemente simple como para ejecutar un comando y analizar el resultado a mis necesidades.

No parece haber muchos consejos decentes sobre el uso de ssh desde C#, sharpSSH y Granados parecen no haberse actualizado durante años, ¿son decentes? ¿Debería ser posible preocupado por problemas de seguridad?

(la información que estoy recuperando no es sensible pero si la aplicación ssh podría tener fallos de seguridad no parcheados (si es que no se han actualizado desde hace años) me preocupa que alguien le robe mis credenciales.

¿Hay otras bibliotecas decentes de C# ssh? Si el resultado del comando es simple, ¿debería ejecutar plink/putty? (¿Es difícil ejecutar un shell de Windows CMD para plink y capturar resultados? Y hay una forma de hacerlo sin el shell apareciendo)?

PS mientras que la biblioteca comercial parece agradable prefiero algo libre (como en el costo y libre en la fuente si es posible).

Respuesta

2

Es muy fácil llamar a plink sin la cáscara apareciendo.

El truco para no mostrar una ventana es establecer ProcessStartInfo.CreateNoWindow = true.
Agregue un poco de manejo de errores a esto y listo.

--- --- PlinkWrapper.cs

using System.Collections.Generic; 
using System.Diagnostics; 

namespace Stackoverflow_Test 
{ 
    public class PlinkWrapper 
    { 
     private string host { get; set; } 
     /// <summary> 
     /// Initializes the <see cref="PlinkWrapper"/> 
     /// Assumes the key for the user is already loaded in PageAnt. 
     /// </summary> 
     /// <param name="host">The host, on format [email protected]</param> 
     public PlinkWrapper(string host) 
     { 
      this.host = host; 
     } 

     /// <summary> 
     /// Runs a command and returns the output lines in a List&lt;string&gt;. 
     /// </summary> 
     /// <param name="command">The command to execute</param> 
     /// <returns></returns> 
     public List<string> RunCommand(string command) 
     { 
      List<string> result = new List<string>(); 

      ProcessStartInfo startInfo = new ProcessStartInfo("plink.exe"); 
      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.CreateNoWindow = true; 
      startInfo.Arguments = host + " " + command; 
      using (Process p = new Process()) 
      { 
       p.StartInfo = startInfo; 
       p.Start(); 
       while (p.StandardOutput.Peek() >= 0) 
       { 
        result.Add(p.StandardOutput.ReadLine()); 
       } 
       p.WaitForExit(); 
      } 

      return result; 
     } 
    } 
} 

--- --- END PlinkWrapper.cs

Llámelo como

PlinkWrapper plink = new PlinkWrapper("[email protected]"); 
foreach (var str in plink.RunCommand("pwd")) 
    Console.WriteLine("> " + str); 

y la salida será como

> /home/albin 

Lo bueno ingenio h plink es que está bien probado y se integra bien con pageant.

1

Si no es reacio a la interoperabilidad con C libs, creo que OpenSSH es una de las mejores bibliotecas disponibles para el trabajo.

0

He utilizado SharpSSH en el pasado para ejecutar comandos en un cuadro de Linux. Hay bastantes pocos errores, y tuve que modificar el código para solucionar algunos de ellos, pero con el tiempo un poco trabajado ...

+2

"eventualmente" y "un poco" no inspiran mucha confianza :) –

6

Código de ejemplo

Hay varias bibliotecas de cliente SSH comerciales para C#. El siguiente código muestra cómo conectarse a un cuadro * nix, ejecutar un comando y leer la respuesta usando nuestro Rebex SSH Shell.

// create client, connect and log in 
Ssh client = new Ssh(); 
client.Connect(hostname); 
client.Login(username, password); 

// run the 'uname' command to retrieve OS info 
string systemName = client.RunCommand("uname -a"); 
// display the output 
Console.WriteLine("OS info: {0}", systemName); 

client.Disconnect(); 

Para los escenarios avanzados (como los comandos interactivos) ver SSH Shell Tutorial.

Referencias & Estabilidad

Usted puede ser que ya utilizan la biblioteca central Rebex SSH sin saber sobre él. El Rebex SFTP (que utiliza esta lib SSH como capa de transporte) es utilizado por Microsoft en varios productos, incluidos Expression Web y Visual Studio 2010. El Rebex SSH Shell es "solo" otra capa en la parte superior (la adición más notable es una terminal emulador).

Puedes descargar una versión de prueba del http://www.rebex.net/ssh-shell.net/download.aspx. Foro de soporte utiliza el motor muy similar a este sitio y se ejecuta en http://forum.rebex.net/

responsabilidad: Estoy involucrado en el desarrollo de Rebex SSH

2

Utilicé SharpSsh lib para hacer un programa de sincronización asíncrona de directorios entre linux y ventanas (elegí sftp para la transferencia segura de archivos). Se mantuvo sin cambios durante años, lo que no significa que no sea seguro.

es muy fácil de usar:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Tamir.SharpSsh; 

namespace sftpex 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       SshExec exec = new SshExec(ipAddress, username, password); 
       Console.Write("Connecting..."); 
       exec.Connect(); 
       Console.WriteLine("OK"); 
       if (exec.Connected) 
        Console.WriteLine(exec.Cipher); 

       while (true) 
       { 
        Console.Write("Enter a command to execute ['Enter' to cancel]: "); 
        string command = Console.ReadLine(); 
        if (command == "") break; 
        string output = exec.RunCommand(command); 
        string[] m = output.Split('\n'); 
        for(int i=0; i<m.Length; i++) 
         Console.WriteLine(m[i]); 
       } 
       Console.Write("Disconnecting..."); 
       exec.Close(); 
       Console.WriteLine("OK"); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 
} 
0

No es un software comercial IP * Works SSH que puede hacer el trabajo.

Cuestiones relacionadas