2010-09-04 2 views
9

Beachten Sie, dass diese auf einem Windows-Rechner sein muss, wie ich C# bin mit dem Zugriff auf Informationen zu WindowsIch mag würde einen Befehl über ssh von einem Windows-Rechner laufen lief mit C#

(Ich brauche Informationen von beide eine Windows-Box und eine Linux-Box, plus ich denke, dass ein Programm/Skript, das ohne GUI läuft und Windows-Fenster von einer Linux-Box ohne Benutzereingriff zugreift, schwieriger wäre, wenn dies nicht wahr ist, bitte sagen Sie mir, würde ich gerne tun mach das auf * nix mit nur dem Teil laufen, der auf windows info auf windows zugreift).

Es gibt eine nette C# api, um diese Informationen aus Windows zu bekommen, auf * nix ist es einfach genug, um einen Befehl auszuführen und die Ausgabe auf meine Bedürfnisse zu parsen.

Es scheint nicht viel anständiger Ratschlag über die Verwendung von SSH von C# da draußen, SharpSSH und Granados scheinen seit Jahren nicht aktualisiert worden, sind sie anständig? Sollte ich über Sicherheitsfragen besorgt sein?

(die Informationen, die ich abrufen bin nicht empfindlich, aber wenn die SSH-Implementierung ungepatchte Sicherheitslücken haben könnte (wenn sie schon seit Jahren nicht mehr aktualisiert) Ich mache mir Sorgen um jemand mein Beglaubigungsschreiben zu stehlen.

Gibt es noch andere anständige C# ssh-Bibliotheken Wenn die Befehlsausgabe einfach ist, sollte ich einfach plink/putty ausführen (ist es schwierig, eine windows cmd-Shell für plink auszuführen und die Ausgabe zu erfassen (und gibt es eine Möglichkeit, dies ohne die Shell zu tun) Aufspringen)?

PS, während die kommerzielle Bibliothek ich lieber etwas frei schön scheint (wie in Kosten und frei in Quelle, wenn möglich).

Antwort

2

Es ist ganz einfach Plink anrufen, ohne die Schale Aufspringen.

Der Trick, kein Fenster anzuzeigen, ist ProcessStartInfo.CreateNoWindow = true.
Fügen Sie einige Fehlerbehandlung hinzu, und Sie sind fertig.

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

Nennen Sie es wie

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

und der Ausgang wird wie sein

> /home/albin 

Das nette Ding Witz h plink ist, dass es sich gut bewährt und integriert sich gut mit pageant.

1

Wenn Sie nicht abgeneigt sind, mit C-Bibliotheken zu interoperieren, ist OpenSSH meiner Meinung nach eine der besten Bibliotheken, die für diesen Job verfügbar sind.

0

Ich benutzte SharpSSH in der Vergangenheit, um Befehle auf einer Linux-Box auszuführen. Es gibt durchaus ein paar Fehler, und ich hatte den Code zu ändern, einige von ihnen zu beheben, aber schließlich es irgendwie funktionierte ...

+2

"Irgendwann" und "irgendwie" inspirieren nicht viel Selbstvertrauen :) –

6

Beispielcode

Es gibt mehrere kommerzielle SSH-Client-Bibliotheken für C#. Der folgende Code zeigt, wie Sie sich mit einer * nix-Box verbinden, einen Befehl ausführen und die Antwort mit unserer Rebex SSH Shell lesen.

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

Für fortgeschrittene Szenarien (wie interaktive Befehle) zu sehen SSH Shell Tutorial.

Referenzen & Stabilität

Vielleicht haben Sie bereits Rebex SSH-Core-Bibliothek verwenden, ohne es zu wissen. Der Rebex SFTP (der diese SSH-Lib als Transportschicht verwendet) wird von Microsoft in verschiedenen Produkten verwendet, einschließlich Expression Web und Visual Studio 2010. Die Rebex SSH Shell ist "nur" eine weitere Schicht darüber (am bemerkenswertesten ist ein Terminal Emulator).

Sie können eine Testversion von http://www.rebex.net/ssh-shell.net/download.aspx herunterladen. Support-Forum nutzt Motor sehr ähnlich diese Seite und läuft auf http://forum.rebex.net/

Disclaimer: Ich bin beteiligt bei der Entwicklung von Rebex SSH

2

Ich benutzte SharpSsh lib, um ein asynchrones Verzeichnis-Sync-Programm zwischen Linux und Windows-Boxen (ich wählte SFTP für sichere Dateiübertragung). Über Jahre unverändert geblieben bedeutet nicht, dass es unsicher ist.

es ist wirklich einfach zu bedienen:

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

Es ist eine kommerzielle Software IP * Works SSH, die die Arbeit erledigen kann.

Verwandte Themen