PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe umleiten



loster
04-11-2007, 17:47
Ich würde gerne die Ausgabe des system() Befehls in eine Variable
speichern .Weiß nur das man die Ausgabe in eine Datei umleiten kann in eine Variable habe ich nichts gefunden.
Jemand eine Ahnung wie man das macht?
Danke

anda_skoa
04-11-2007, 18:16
Dafür ist system() nicht gedacht. Dafür kommt so Lowlevel am ehesten popen() in Frage.

Ciao,
_

loster
04-11-2007, 18:29
Nun ja das problem ist ich schreibe mir gerade eine Port Bind Shell mit folgendem Code:

Server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{ int x;

int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"Kein Port ausgewählt\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR beim öffnen des Sockets");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR beim binden ");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR beim verbinden");

while(1)
{

bzero(buffer,256);

n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR beim lesen vom CLient");
printf("Here is the message: %s\n",buffer);


x=system(buffer);

n = write(newsockfd,"I got your message\n",18);
if (n < 0) error("ERROR beim schreiben zum Client");
n = write(newsockfd,"\n",1);
if (n < 0) error("ERROR beim schreiben zum Client");

if (x != 0)
{n = write(newsockfd,"Fehler bei der ausfuehrung\n",28);}

if (n < 0) error("ERROR beim schreiben zum Client");



}
return 0;
}

und die ausgabe des jeweiligen Befehles der ausgeführt wird soll dem Client gesendet werden.. deshalb dachte ich es wäre am einfachsten die Ausgabe in eine Variable zu speichern und zu übermitteln .
Vielleicht kennt jemand eine andere Lösung oder ist das mit der Variable doch irgendwie realisierbar.

anda_skoa
04-11-2007, 23:42
Nachdem bei einem externe Programm die Länge des Outputs schwer abschätzbar ist, gibt popen() ein FILE Handle zurück, d.h. man kann den Output des Programms so lesen, wie eine Datei.

Übrigens ist bzero als "Deprecated" (veraltet, überholt) markiert und es wird empfohlen, stattdessen memset zu benutzen.

Ciao,
_

loster
05-11-2007, 16:16
Danke..
Ich hab jetzt mal bzero noch gelassen weil ich das erster hinbekommen möchte:
Habe jetzt popen() verwendet um die Ausgabe in ein File zu lesen und anschließend durch eine schleife jede zeile zu versenden:

/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{ int x;
char line[130];
FILE *fp;
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"Kein Port ausgewählt\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR beim öffnen des Sockets");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR beim binden ");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR beim verbinden");

while(1)
{

bzero(buffer,256);


n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR beim lesen vom CLient");
printf("Here is the message: %s\n",buffer);

fp = popen(buffer, "r"); /* Issue the command. */

/* Read a line */
while ( fgets( line, sizeof line, fp))
{
n = write(newsockfd,line ,sizeof line);

if (n < 0) error("ERROR beim schreiben zum Client");
}
pclose(fp);


n = write(newsockfd,"I got your message\n",18);
if (n < 0) error("ERROR beim schreiben zum Client");
n = write(newsockfd,"\n",1);
if (n < 0) error("ERROR beim schreiben zum Client");




if (n < 0) error("ERROR beim schreiben zum Client");



}
return 0;
}


Wenn ich allerdings den socket starte und mit nc verbinde kommt folgendes:
nc localhost 1000
ls
Myfirstsocket
HóˇÔ.žż(none)Ô.žż@/žżđč.žżSocket.c~
et
HóˇÔ.žż(none)Ô.žż@/žżđč.žża.out
c~
et
HóˇÔ.žż(none)Ô.žż@/žżđč.žżmyfirstsocketclient
HóˇÔ.žż(none)Ô.žż@/žżđč.žżserver.c
ketclient
HóˇÔ.žż(none)Ô.žż@/žżđč.žżserver.c~
etclient
HóˇÔ.žż(none)Ô.žż@/žżđč.žżsocket
~
etclient
HóˇÔ.žż(none)Ô.žż@/žżđč.žżI got your message

ich schicke ein ls zum server und das kommt zurück ..
Wie kann ich diesen Fehler verhindern?

anda_skoa
05-11-2007, 17:00
Vielleicht hilft es, wenn du nur den gültigen Teil des Strings an den Client schickst, also nicht den ganzen "line" Puffer, sondern nur den Teil bis einschließlich terminierendem Nullbyte.

Ciao,
_

loster
05-11-2007, 17:04
macht das sizeof nicht ?
Wenn nicht wie würde das dann in meinem Beispiel aussehen?
Hatte so ein problem noch nicht..
Danke

jeebee
05-11-2007, 18:05
sizeof gibt dir die Grösse des Arrays in Bytes...
um die Länge eines Strings zu erhalten gibts zb strlen() aus der string.h

loster
05-11-2007, 18:43
danke hab jetzt eine lösung gefunden..