Tests mit Plink.exe Verbindung zu SSH in C#
Ich versuche, um eine Verbindung zu einem unix-terminal über plink.exe. Das Ziel ist also, dass ich den text Lesen kann zurück in einen string.
Mein dilema ist, dass die bank für die ich arbeite nutzt eine alte as400-Typ-system, das wir normalerweise Zugang über putty. Ich versuche zu entwickeln, die eine automation suite, die eine Schnittstelle mit dem system und führen Sie Aufträge aus und analysieren die ist-Ausgaben etc.
So, ich dachte, ich würde verwenden plink-durch C#. Wenn ich den code ausführen über die Eingabeaufforderung bekomme ich (in etwa) den text muss ich zurück. Aber im leiden, ein problem in meinem C# - code, dass es nur hängt und ich bekomme nie eine Antwort.
Was ich möchte, ist wie dieser:
Server verbinden
Input-Befehl
Lesen Bildschirm zurück
//Weitere Befehle etc
Hier ist mein code bisher:
class Program
{
static void Main(string[] args)
{
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Windows\System32\cmd");
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
psi.CreateNoWindow = false;
Process process = Process.Start(psi);
string cmdForTunnel = @"c:\putty\plink -ssh jonkers@bankhq -pw automationhero";
process.StandardInput.WriteLine(cmdForTunnel);
//process.WaitForExit();
Thread.Sleep(30000);
string output = process.StandardOutput.ReadToEnd();
Console.WriteLine(output);
//DoBusinessLogic();
process.StandardInput.WriteLine("logout");
Thread.Sleep(10000);
if (process.HasExited)
{
process.Close();
process.Dispose();
}
}
}
Ich bin nicht wirklich sicher, wo die Probleme liegen, weil, wie ich sage, ich habe getestet mit plink über die Befehlszeile, aber mit meiner Lösung oben hängt es sich einfach auf. Ich habe versucht, mit anderen Völkern Lösungen auf stackoverflow, aber keiner von Ihnen scheint zu funktionieren für mich, da ich immer dieser hängen. Und Tipps würde sehr geschätzt.
BEARBEITEN
Habe ich jetzt beschlossen, die Renci Scharfe SSH-Bibliothek und habe meinen eigenen Rahmen um diese. Es funktioniert viel besser.
- Ich nehme an
ReadToEnd
blockieren, bis plink beendet wird, indem die remote-host - ... sollten Sie versuchen, Schritt durch den code (F10), um festzustellen, wo Sie wirklich hängen - Ja das habe ich versucht... es geht einfach immer weiter. Ich bin nicht sicher, mit Plink.exe ist auch die beste Methode hier. Vielleicht über SSH direkt ist besser.
- Nun gibt es ein paar Lösungen... Implementieren ein SSH-client ist auf der härteren 😀 Tun, müssen Sie eine
.Net
Umfeld? Auch Sie noch nicht sagen, uns wo genau dein code hängt! - Vorzugsweise .net unser development-manager ist ein microsoft fanboy so wird nicht lassen Sie mich mit Java, das ist wohl die Sprache, die im mehr vertraut mit. Der code hängt in der Zeile: string Ausgabe = Prozess.StandardOutput.ReadToEnd();
- OK, gut Sie dies können .net völlig in Ordnung. Zuerst von allen, müssen Sie beginnen, um inmplement der lese-schreib-asynchron...im Wesentlichen ausgeführt, das Lesen (Read statt ReadToEnd oder ReadLine) in einem anderen thread, und das signal, Ihre schreib-thread (kann den original-thread) zu senden, logout-signal, sobald Sie haben alle die Daten Sie brauchen. Sie können prüfen wollen, wie zu Lesen ist-Prozesse asynchron
- Ok danke MrPaulch ich werde in diese Aussehen. Vielen Dank für die Zeit nehmen, mir zu helfen. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, ich wollte nur testen
plink
mich und naja, Ergebnis waren ziemlich erfreulich.Wie gesagt in den Kommentaren, die Sie nicht verwenden können
ReadToEnd
vor senden Sie das Ausfahrt Befehl, es sei denn, Sie wollen block Ihre aktuellen Thread.Eigentlich könnten Sie senden Sie einfach eine Reihe von Befehlen (einschließlich der
exit
oderlogout
) vor der Aufnahme derReadToEnd
, aber ich wollte vorschlagen, zu tun, die Lesen asynchrounusly, wie es ist robuster.Nun gibt es ein paar Möglichkeiten, das zu tun asynchronen Lesen von einem stream.
Den
Process
Klasse bietetEvents
erhöht, die auf eingehende Daten. Sie könnten Handler für diejenigen, dieEvents
.Diese Ereignisse sind:
OutputDataReceived
ErrorDataReceived
Ihre event-Handler stellen strings mit den Daten.
Könnten Sie die
BeginRead
desStreamReader
Instanzen von stdout/stdin.Aber hier biete ich ein code-Beispiel, dass es auf eine eher grobe Art und Weise mit einfachen multi-threading:
Also, wenn Sie wollen, um den Inhalt der Benutzer-Verzeichnis von einem entfernten host aufrufen:
Natürlich ersetzen Sie Ihre eigene Adresse, Zugangsdaten und der command-Liste.
Auch möchten Sie vielleicht zu reinigen Sie den Ausgabe-string. e.G. in meinem Fall sind die Befehle, die ich senden auf dem remotehost-echo sind in der Ausgabe und scheinen daher in der return string.
Hey der obige code funktionierte teilweise für mich, aber es war eine gute Hilfe, die ich ragt ersetzt die Auftragnehmer-Parameter wie folgt
const string PLINK_PATH = @"C:\Program Files (x86)\PuTTY\plink.exe";
Hoffe, das hilft, mit obigen code....