PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dauerhaft per C-Programm Befehle in eine(!) CMD eingeben [Hilfe]



Deshoax
20.02.2010, 19:30
Nabend Leute,

Ich schreib gerade an einer remoteshell und stehe vor einen ernsthaften knackpunkt.

Im momment ist es so, dass ich die Befehle vom Clienten bekomme, dann über eine Pipe (http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx) ausführen lasse und über die Pipe die Ausgabe zum Clienten schicke.

Das Problem ist, wie ihr euch sicher denken könnt, dass die CMD auf und nach dem Befehl wieder zugeht (Bildlich gesprochen). D.h. cd irgendeinenOrdner wird nicht funktionieren, weil die cmd danach wieder zu ist, und wieder im Exec-Ordner aufgeht.

Daher meine Frage:

Wie kriege ich eine dauerhafte cmd zu stande, der ich Befehle übermitteln kann und wo ich die Ausgaben wieder auslesen kann ?

MfG

Deshoax

blackberry
20.02.2010, 19:37
Versuch's mal mit popen.
Das ganze funktioniert wie fopen, nur eben mit Prozessen.

Ist aber kein ANSI-C.

Deshoax
20.02.2010, 19:54
popen ist der Befehl unter Unix.
Ich wollte die "Shell" unter windows aufbauen.

EDIT: Ich glaub, das trifft es , was ich machen möchte.

http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

blackberry
21.02.2010, 03:00
popen ist der Befehl unter Unix.

Dann hält mein Win7 sich wohl für ein UNIX-artiges Betriebssystem:
http://www.imagebanana.com/img/66187gy7/zuztf.png

Sourcecode:

#include <stdio.h>


int main(void)
{
FILE *fp;
char buffer[100];
int len;

if (!(fp = popen("echo Hello, World!", "rb")))
{
perror("Fehler: konnte den Prozess nicht starten");
return 1;
}

fgets(buffer, sizeof(buffer) - 1, fp);
printf("buffer = \"%s\"\n", buffer);

pclose(fp);
return 0;
}

Compiler:
MinGW gcc (kam mit Dev-C++ 4.9.9.2)

_popen wird von msvcrt.dll exportiert.


MfG. BlackBerry

GregorSamsa
21.02.2010, 16:24
Alternativ kannst du natürlich auch den CD-Befehl abfangen, und chdir(...) benutzen, um dem Pfad den C-Programmes zu ändern

Deshoax
21.02.2010, 21:45
Dann muss ich mich bei dir Entschulidgen Blackberry, du hattest recht. Jedoch krieg ich mit popen im VisualStudio nen Error, deswegen danach mit Dev-Cpp probiert und es funktioniert.... so wie vorher auch.
Das heißt, dass sich mit dem popen-Befehl praktisch eine cmd Instanz öffnet und danach wieder schließt. Ich wollte es aber so umsetzten, dass ich eine permanete Instanz habe, in der ich Befehle eingeben kann und wieder empfangen kann.

Mein Problem ist halt jetzt, dass ich den Code samt Dokumentation der MSDN über Childprozesse ziemlich undurchsichtig finde.

Ich habe gerade eben probiert, ob ich da nich die Befehle per Schleife in en Char-array packen kann und dann immer wieder write read... aber dann kacken mir die Handles ab...

UND: Da sind einfach viel zu viele Microsoft-Non-Standard-Funktionen drinne...

Gibts da nicht irgendwie eine Allgemeinere, standardisiertere Möglichkeit, nen Childprozess zu erstellen und Stdin und Stdout mit dem Mutterprozess zu verknüpfen?