2015-06-17 28 views
5

muszę wykonać tę czynność przy użyciu kodu C#:Jak uruchamiać polecenia na serwerze SSH w języku C#?

  1. otwarty putty.exe w tle (to jest jak okno cmd)
  2. logowanie do zdalnego hosta przy użyciu adresu IP
  3. enter nazwa użytkownika i hasło
  4. Wykonaj kilka poleceń jedna po drugiej.
  5. uruchomić inną komendę, która dostaje odpowiedź mówiąc mi, że polecenia wpadłem wcześniej gdzie wykonana pomyślnie

Więc staram się zrobić to tak:

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

Czy chcesz uruchomić ten sam zestaw poleceń za każdym razem?Jeśli tak, spróbuj dodać je do swojego pliku '.bashrc'. Jeśli chcesz uruchamiać różne polecenia, powiedz nam. – AirPett

+0

Polecenia, których używam, to dodawanie adresów MAC użytkowników do kontrolera Wi-Fi. Więc w zasadzie polecenia są takie same, ale z innym adresem MAC za każdym razem ... Czy możesz mi powiedzieć, co to jest plik '.bashrc' i jak mogę go dodać? –

+0

JEŻELI jest serwerem Linux (przypuszczam, że tak, ponieważ używa ssh), w katalogu domowym użytkownika jest plik o nazwie '.bashrc' (/home/$user/.bashrc). Ten plik jest skryptem powłoki, który jest wykonywany za każdym razem, gdy użytkownik się loguje. Na przykład echo niektórych szczegółów dotyczących wydajności serwera zawsze przy logowaniu (tj. 'Df -h' i' uptime'). – AirPett

Odpowiedz

10

Można spróbować https://sshnet.codeplex.com/ . Dzięki temu nie potrzebujesz w ogóle szpachli ani okienka. Możesz również uzyskać odpowiedzi. To by wyglądało cos. lubię to.

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; 

Edycja: Innym podejściem byłoby użycie powłoki powłoki.

Tworzenie ShellStream raz podoba:

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

Następnie można użyć polecenia takiego:

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

Pobrany plik, który został połączony, jeśli dotyczy projektu biblioteki klas? Więc muszę go skompilować i odwołać się do jego biblioteki DLL w moim projekcie? –

+0

Możesz to łatwo uzyskać poprzez pakiet NuGet. Zobacz [tutaj] (https://www.nuget.org/packages/SSH.NET/). Następnie wystarczy dodać go jako odniesienie. – LzyPanda

+0

Czy możesz mi powiedzieć, jeśli muszę uruchomić "włącz" polecenie, które monituje mnie o inne hasło, czy mogę go uruchomić z podanym powyżej przykładowym kodem? –

1

Chociaż odpowiedź przez @LzyPanda działa, używając SSH "shell" kanał (SshClient.CreateShellStream), niech tylko terminal interaktywny, nie jest dobrym pomysłem do automatyzacji wykonywania poleceń. Otrzymasz wiele skutków ubocznych z tym, jak wiersza poleceń, sekwencje ANSI, interaktywne zachowanie niektórych poleceń itp

do automatyzacji, należy użyć SSH „exec” kanał (SshClient.CreateCommand):

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

Jeśli potrzebujesz wykonać wiele poleceń, powtórz powyższy kod. Możesz utworzyć dowolną liczbę kanałów "exec" dla jednego połączenia SSH.

Jednak jeśli polecenia zależą od siebie (pierwsze polecenie zmodyfikowało środowisko, np. Zmienne, które są używane przez te ostatnie polecenia), uruchom je w jednym kanale. Użyj składni powłoki na to, jak && lub ;:

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

Jeśli trzeba stale czytać wykorzystanie wyjścia polecenia:

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

Można również użyć ExtendedOutputStream, który zawiera zarówno stdout i stderr. Zobacz SSH.NET real-time command output monitoring.


Niestety realizacja kanału "exec" w SSH.NET nie pozwala na sprawdzenie danych wejściowych do polecenia. W tym przypadku trzeba będzie użyć kanału "shell", dopóki to ograniczenie nie zostanie rozwiązane.