| Autor |
Beitrag |
sharpx
      
Beiträge: 51
|
Verfasst: Mo 05.01.09 14:37
Folgende Situation:
Ich bekomme von einem Client systemnahe Befehle wie: dir, cd, help, etc.
Diese sollten ausgeführt werden. Wie kann ich das am besten realisieren?
System.Threading.Thread.Start() hilft hier nicht wirklich.
danke für die hilfe Moderiert von Christian S.: Topic aus C# - Die Sprache verschoben am Mo 05.01.2009 um 13:43
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 14:43
Was ist denn jetzt genau das Problem? Das Ausführen der Befehle? Wie du sie von dem Client bekommst? 
|
|
sharpx 
      
Beiträge: 51
|
Verfasst: Mo 05.01.09 14:53
1) Muss ich die Antwort der Befehle dem Client zurück senden. Dies geht nicht mit einem System.Thread.Thread.Start()
2) Die Lösung befehl + "> out.txt" und dann out.txt auslesen und dem Client senden:
a) Funktioniert nicht weil er "out.txt" nicht finden kann... verstehe das selber nicht ganz
b) wäre sehr unschön.
Es muss doch sowas wie popen() geben, wo ich nicht die Kontrolle des auszuführenden Programmes verliere?
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 15:00
Ich dachte du willst die Befehle selbst implementieren. Wenn du eine Kommandozeile startest und dort cd ausführst und die dann wieder schließt, dann ist ja die Wirkung verpufft.
cd kannst du z.B. mit Directory.SetCurrentDirectory implementieren.
Ansonsten müsstest du (evtl mit Process.Start, kA ob und wie das damit geht) die Kommandozeile einmalig starten und dann immer Befehle an diese senden und Ausgaben auslesen. Das geht z.B. mit Pipes. Wie das aber in C# geht weiß ich nicht.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 05.01.09 15:36
Hallo,
es geht auch mit einer Console-Anwendung. Der Eingabe-Stream In und vor allem der Ausgabe-Stream Out können umgeleitet werden; dadurch kannst Du auch die Ergebnisse eines Befehls wie dir abfragen. (Aber das habe ich noch nie gemacht, kann deshalb nicht mehr sagen.)
Gruß Jürgen
|
|
sharpx 
      
Beiträge: 51
|
Verfasst: Mo 05.01.09 16:46
Dann bin ich wohl mal richtig mit dem Code hier:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| public static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { cmdvalue = e.Data; Console.WriteLine(cmdvalue); StreamWriter sw = new StreamWriter("out.txt"); sw.Write(cmdvalue); sw.Close(); }
public static string execute_p (string cmd) { string tmp = ""; try { Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = cmd; p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); p.Start(); p.BeginOutputReadLine(); return cmdvalue; } catch { return "error"; } } |
Jedoch!
der Rückgabewert von cmdvalue ist einfach leer! Wenn ich jedoch Console.WriteLine(cmdvalue) vor return cmdvalue; mache, seh ich das ergebnis des befehls. (cmdvalue ist global als static string cmdvalue = ""; definiert)
der andere versuch war das ergebnis in eine datei zu schreiben.
egal ob ich sw.Write() oder sw.WriteLine() verwendet, die Datei blebit immer leer?
Irgendwas stimmt hier doch nicht?
Danke für die Hilfen
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 16:54
Ich werde gleich mal schauen, aber ich vermute, dass deine Prozedur einfach bereits beendet ist bevor das Event ausgelöst wird. Und dann wäre der Wert ja noch leer.
Du musst ereignisorientiert denken.
Das andere Problem: Du startest jedesmal einen neuen Prozess für jeden Befehl. Wie ich bereits sagte bringt dir das nichts bei einigen Befehlen. Bei cd wie in deinem oben genannten Beispiel wird bspw. das Arbeitsverzeichnis des Prozesses gewechselt. Also der laufenden cmd.exe. Jetzt wird diese beendet und damit ist die Wirkung auch verloren.
Du musst entweder die Befehle selbst verarbeiten (bei dir und cd usw. ginge das ja sehr einfach) oder einen Prozess cmd.exe bis zum Ende behalten und nur Ein- und Ausgaben damit verarbeiten.
|
|
sharpx 
      
Beiträge: 51
|
Verfasst: Di 06.01.09 19:28
Kannst du mir da ein Codebeispiel liefern?
Danke!
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 06.01.09 20:37
Für was von dem was ich gesagt habe?
Wo ist denn konkret das Problem gerade? 
|
|
sharpx 
      
Beiträge: 51
|
Verfasst: Di 06.01.09 22:36
|
|