Autor Beitrag
sharpx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 51



BeitragVerfasst: 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 user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 05.01.2009 um 13:43
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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? :gruebel:
sharpx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 51



BeitragVerfasst: Mo 05.01.09 16:46 
Dann bin ich wohl mal richtig mit dem Code hier:


ausblenden volle Höhe C#-Quelltext
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.StartInfo.Arguments = "192.168.0.254";
          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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 51



BeitragVerfasst: Di 06.01.09 19:28 
Kannst du mir da ein Codebeispiel liefern?

Danke!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 06.01.09 20:37 
Für was von dem was ich gesagt habe? :lol:

Wo ist denn konkret das Problem gerade? :gruebel:
sharpx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 51



BeitragVerfasst: Di 06.01.09 22:36 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Für was von dem was ich gesagt habe? :lol:

Wo ist denn konkret das Problem gerade? :gruebel:


Immer noch das selbe Problem:
Zitat:

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? :(