Ausgabe eines Aufgerufenen Programms in C verwenden
-
sscanf
ist zum lesen aus Strings.Da mit der Pipe die Standardausgabe von dem linken Programm zur Standardeingabe vom rechten Programm wird, kannst mit den ganz normalen Ein-/Ausgabefunktionen arbeiten:
scanf
(nur ein s)Da bedeutet aber auch, dass dein Programm nmap nicht mehr mit system aufruft.
mekick schrieb:
Ich dachte man kann einfach entweder die Ausgabe in eine Datei schreiben lassen, aus der ich dann die sachen auslese oder
Klar, geht auch.
Wenn du dein Programm richtig anfängst, gibt es keinen großen unterschied zu der Pipe-Version.mekick schrieb:
... oder dass ich direkt die Terminalausgabe aus demselben lesen kann. Ka. zB mit sscanf() ... aber ich weis ja nicht wie..
was ist an "Nutze
popen
" so schwer zu verstehen.
Wenn du nicht weiß wie dupopen
einsetzen kannst, ist das was anderes.
(Was der Bauer nicht kennt, frisst er nicht)das p bei popen steht übrigens für Pipe.
Und: http://de.wikipedia.org/wiki/Filter_(Unix)
-
DirkB schrieb:
sscanf
ist zum lesen aus Strings.Da mit der Pipe die Standardausgabe von dem linken Programm zur Standardeingabe vom rechten Programm wird, kannst mit den ganz normalen Ein-/Ausgabefunktionen arbeiten:
scanf
(nur ein s)Da bedeutet aber auch, dass dein Programm nmap nicht mehr mit system aufruft.
mekick schrieb:
Ich dachte man kann einfach entweder die Ausgabe in eine Datei schreiben lassen, aus der ich dann die sachen auslese oder
Klar, geht auch.
Wenn du dein Programm richtig anfängst, gibt es keinen großen unterschied zu der Pipe-Version.mekick schrieb:
... oder dass ich direkt die Terminalausgabe aus demselben lesen kann. Ka. zB mit sscanf() ... aber ich weis ja nicht wie..
was ist an "Nutze
popen
" so schwer zu verstehen.
Wenn du nicht weiß wie dupopen
einsetzen kannst, ist das was anderes.
(Was der Bauer nicht kennt, frisst er nicht)das p bei popen steht übrigens für Pipe.
Und: http://de.wikipedia.org/wiki/Filter_(Unix)Korrekt. Ich kenne popen nicht ! ^^
Ok. Gehen wir davon aus ich möchte das mit dem Ausgabe in Datei umlenken machen und danach die Datei durchgehen und daraus die sachen einlesen ...
how to() ?
ist das einfach ne while-schleife, die runterläuft bis es keine nächste zeile mehr gibt und von oben alles in einen string schreibt oder wie hab ich mir das vorzustellen?
LG und DANKE!
Felix
-
So sieht das ganz realistisch aus, was ich einlesen muss:
Starting Nmap 6.46 ( http://nmap.org ) at 2014-06-20 16:09 CEST Stats: 0:00:05 elapsed; 0 hosts completed (0 up), 256 undergoing Ping Scan Ping Scan Timing: About 41.99% done; ETC: 16:09 (0:00:07 remaining) Stats: 0:00:05 elapsed; 0 hosts completed (0 up), 256 undergoing Ping Scan Ping Scan Timing: About 84.96% done; ETC: 16:09 (0:00:01 remaining) Stats: 0:00:07 elapsed; 233 hosts completed (23 up), 23 undergoing Connect Scan Connect Scan Timing: About 90.29% done; ETC: 16:09 (0:00:00 remaining) Nmap scan report for MarkusB_I5-760.domain.de (192.168.4.85) Host is up (0.00086s latency). Not shown: 44 filtered ports PORT STATE SERVICE 80/tcp open http 443/tcp open https 445/tcp open microsoft-ds Nmap scan report for linux-dp.domain.de (192.168.4.121) Host is up (0.00012s latency). All 47 scanned ports on linux-dp.domain.de (192.168.4.121) are closed Nmap scan report for linux-jl2.domain.de (192.168.4.126) Host is up (0.000089s latency). All 47 scanned ports on linux-jl2.domain.de (192.168.4.126) are closed Nmap scan report for 192.168.4.140 Host is up (0.00024s latency). Not shown: 46 closed ports PORT STATE SERVICE 80/tcp open http Nmap scan report for 192.168.4.154 Host is up (0.00018s latency). Not shown: 46 closed ports PORT STATE SERVICE 445/tcp open microsoft-ds Nmap scan report for 192.168.4.161 Host is up (0.0100s latency). Not shown: 46 closed ports PORT STATE SERVICE 21/tcp open ftp Nmap scan report for linux-testserver3.domain.de (192.168.4.164) Host is up (0.00033s latency). Not shown: 45 closed ports PORT STATE SERVICE 21/tcp open ftp 80/tcp open http Nmap scan report for linux-testserver4.domain.de (192.168.4.165) Host is up (0.00029s latency). Not shown: 44 closed ports PORT STATE SERVICE 21/tcp open ftp 53/tcp open domain 80/tcp open http Nmap scan report for 192.168.4.166 Host is up (0.00026s latency). All 47 scanned ports on 192.168.4.166 are closed Nmap scan report for 192.168.4.168 Host is up (0.00026s latency). All 47 scanned ports on 192.168.4.168 are closed Nmap scan report for 192.168.4.207 Host is up (0.00022s latency). Not shown: 40 closed ports PORT STATE SERVICE 21/tcp open ftp 25/tcp open smtp 80/tcp open http 443/tcp open https 445/tcp open microsoft-ds 515/tcp open printer 631/tcp open ipp Nmap scan report for 192.168.4.208 Host is up (0.00020s latency). Not shown: 45 closed ports PORT STATE SERVICE 80/tcp open http 515/tcp open printer Nmap scan report for asterisk.domain.de (192.168.4.236) Host is up (0.00017s latency). Not shown: 44 closed ports PORT STATE SERVICE 21/tcp open ftp 80/tcp open http 443/tcp open https Nmap scan report for Server.domain.de (192.168.4.240) Host is up (0.00020s latency). Not shown: 45 closed ports PORT STATE SERVICE 445/tcp open microsoft-ds 631/tcp open ipp Nmap scan report for 192.168.4.243 Host is up (0.00039s latency). Not shown: 44 closed ports PORT STATE SERVICE 80/tcp open http 443/tcp open https 445/tcp open microsoft-ds Nmap scan report for 192.168.4.245 Host is up (0.00017s latency). Not shown: 43 closed ports PORT STATE SERVICE 80/tcp open http 443/tcp open https 445/tcp open microsoft-ds 631/tcp open ipp Nmap scan report for 192.168.4.246 Host is up (0.00018s latency). Not shown: 44 closed ports PORT STATE SERVICE 443/tcp open https 445/tcp open microsoft-ds 631/tcp open ipp Nmap scan report for mail-test.domain.de (192.168.4.247) Host is up (0.00058s latency). Not shown: 40 filtered ports PORT STATE SERVICE 25/tcp open smtp 80/tcp open http 110/tcp open pop3 143/tcp open imap 465/tcp closed smtps 993/tcp open imaps 995/tcp open pop3s Nmap scan report for dav.mail (192.168.4.248) Host is up (0.00072s latency). Not shown: 42 filtered ports PORT STATE SERVICE 80/tcp open http 443/tcp open https 465/tcp open smtps 993/tcp open imaps 995/tcp open pop3s Nmap scan report for 192.168.4.249 Host is up (0.00033s latency). Not shown: 46 closed ports PORT STATE SERVICE 80/tcp open http Nmap scan report for 192.168.4.251 Host is up (0.0011s latency). Not shown: 46 closed ports PORT STATE SERVICE 80/tcp open http Nmap scan report for INTEC_EM.domain.de (192.168.4.252) Host is up (0.00079s latency). Not shown: 43 closed ports PORT STATE SERVICE 25/tcp open smtp 110/tcp open pop3 143/tcp open imap 445/tcp open microsoft-ds Nmap scan report for Lancom_1611.domain.de (192.168.4.253) Host is up (0.00045s latency). Not shown: 45 closed ports PORT STATE SERVICE 80/tcp open http 443/tcp open https Nmap done: 256 IP addresses (23 hosts up) scanned in 7.75 seconds
-
DirkB schrieb:
was ist an "Nutze
popen
" so schwer zu verstehen.Mit popen ersparst du dir den Umweg über eine extra Datei; das kann bei deinem überschaubaren C-Wissen nur von Vorteil für Lösung deines Problems sein.
-
mekick schrieb:
how to() ?
ist das einfach ne while-schleife, die runterläuft bis es keine nächste zeile mehr gibt und von oben alles in einen string schreibt oder wie hab ich mir das vorzustellen?
Ja, möglicherweise. Du kannst aber gleich beim lesen auswerten.
mekick schrieb:
So sieht das ganz realistisch aus, was ich einlesen muss: ...
Und was möchtest du davon haben?
Die Anzahl der Wörter oder die IP-Adressen oder .... ?
DAvon hängt es dann ab, wie du weiter machst.
-
Ist das ein Rumgeeiere hier! Ich habe hier einmal ein Beispiel für drei mögliche Ansätze:
- Ausgabe umleiten in eine Datei.
- Ausgabe per popen zeilenweise einlesen
- Ausgabe per popen im Block einlesen
Das Beispiel kann optimiert werden und auf persönliche Anforderungen angepasst werden
(und es gibt auch noch andere Möglichkeiten), aber es zeigt, wie es gehen kann:#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> void to_file (char* cmd) { char redirect[256] = ">tmp.txt "; strcat (redirect, cmd); system (redirect); } void popen_line_by_line (char* cmd) { char psBuffer[128] = {0}; FILE *pPipe; pPipe = popen( "ls -l", "r" ); if( !pPipe ) exit( 1 ); while(fgets(psBuffer, 128, pPipe)) { printf ("%s",psBuffer); fflush (stdout); } pclose (pPipe); } void popen_to_buffer (char* cmd) { char psBuffer[128] = {0}; char msgBuffer[4096] = {0}; FILE *pPipe; pPipe = popen(cmd , "r" ); if( !pPipe ) exit( 1 ); while(fgets(psBuffer, 128, pPipe)) { printf ("%s",psBuffer); fflush (stdout); strcat(msgBuffer,psBuffer); } pclose (pPipe); printf ("%s",msgBuffer); } int main ( void ) { char* cmd = "ls -l"; // Nach Bedarf auskommentieren to_file(cmd); popen_line_by_line (cmd); popen_to_buffer(cmd); return 0; }
Ich persönlich hätte für die Aufgabe eine modernere Skriptsprache (z.B. PHP) gewählt,
da diese die gewünschte Funktionalität fest und relativ idiotensicher eingebaut haben.viele grüße
ralph
-
Die wohl in den meisten Fällen "richtigste" Möglichkeit ist aber immer noch das, was Th69 vorgeschlagen hat. Alles deutet da drauf hin, dass dies auch hier die richtige Wahl wäre.
Man muss nicht immer die genaue Frage des Threaderstellers beantworten, wenn doch offensichtlich ein X-Y Problem vorliegt.
-
rkhb schrieb:
... void to_file (char* cmd) { char redirect[256] = ">tmp.txt "; strcat (redirect, cmd); system (redirect); ... int main ( void ) { char* cmd = "ls -l"; // Nach Bedarf auskommentieren to_file(cmd); ... }
Was macht denn der Befehl
>tmp.txt ls -l
?
-
Das ist ein Deppenbeispiel, und genau so macht man es eben nicht.
Das Deppenbeispiel setzt voraus, dass im aktuellen Verzeichnis Schreibrechte und ausreichend Platz vorliegen, und wer räumt den Müll da hinterher wieder weg?
Genau, der Deppenprogrammierer sicherlich nicht.
All das entfällt, wie oben erwähnt, wenn man die POSIX konforme Funktion popen/pclose verwendet.
-
DirkB schrieb:
Was macht denn der Befehl
>tmp.txt ls -l
?Das Gleiche wie in einer Windows-Konsole ">tmp.txt dir". Der Trick: Man kann die Umleitung auch nach vorne bringen.
viele grüße
ralph
-
Nur als Hinweis... nmap unterstützt verschiedene Ausgaben. Es gibt so zB grepable- und auch xml-Ausgaben.
-
Nur zur info .. ich habe jetzt folgende Lösung gewählt:
1. gesamten Output in output.txt schreiben
2. mit getline() aus dem gcc GNU Compiler Zeilenweise einlesen
3. mit den strXXX()-Funktionen die Inhalte der einzelnen Zeilen auf Muster vergleichenDas schien mir anhand meiner bisherigen Kenntnisse die geeignetste Lösung und da ich mir nochmals die Anwendung des Programms vor Augen geführt habe ist mir klar geworden, dass es gar nicht schlecht ist, dass ich nun eine Ausgabedatei erhalte, da ich im Laufe des Programms mehrere Aufrufe machen müsste oder aber unübersichtliche Variablendefinitionen zwischenschieben müsste, so aber jetzt einfach immer wieder die output.txt als bestehenden Ausgangsstream nutzen kann.
Ich meine diese Lösung nennt sich jetzt Ausgabe in Datei umlenken und anschließendes Pathen ..?
Danke für eure Hilfe!!
Liebe Grüße,
FelixHier nochmal der Code:
// Pointer auf Datei = ptoutput FILE *ptoutput; // Prototyp von getline(): ssize_t getline(char** ReservierterSpeicherFürInputLine, size_t* ByteGrößeDesReserviertenSpeichers, FILE* InputStream) // Speicher für Buffer/InputLine festlegen char * ptline_in; ptline_in = (char *) malloc(70); // Variable für die Größe der Textzeile in Bytes size_t istorage = 70; // Wenn die Datei output.txt nicht geöffnet werden kann // Gebe Error aus if ( (ptoutput = fopen("output.txt","r")) == NULL) { fprintf(stderr, "\nKonnte Datei 'output.txt' nicht öffnen!"); return EXIT_FAILURE; } // Zeilenweises Einlesen von output.txt und Ausgeben der Gelesenen Zeilen und der Größe der Zeilen while(getline(&ptline_in, &istorage, ptoutput) > 0) { printf("Line: %s \nBytes: %u \n", ptline_in, istorage); } return EXIT_SUCCESS;
-
Du hast
free
vergessen.
-
mekick schrieb:
Ich meine diese Lösung nennt sich jetzt Ausgabe in Datei umlenken und anschließendes Pathen ..?
Du meinst "parsen"!
Und wer erzeugt jetzt die Textdatei?
Trotzdem ist meine Variante immer noch die einfachste, nämlich von der Standardeingabe (stdin) zu lesen, anstatt aus einer Datei...