5 Stimmen

Wie kann ich einen String in einen popen()-Befehl in C einfügen?

Im arbeiten in c (mehr oder weniger zum ersten Mal) für uni, und ich brauche, um eine MD5 aus einem Zeichen-Array zu generieren. Die Zuweisung gibt an, dass dies durch Erstellen einer Pipe und Ausführen der md5 Befehl auf dem System.

Ich bin schon so weit gekommen:

FILE *in;
extern FILE * popen();
char buff[512];

/* popen creates a pipe so we can read the output
 * of the program we are invoking */
char command[260] = "md5 ";
strcat(command, (char*) file->name);
if (!(in = popen(command, "r"))) {
    printf("ERROR: failed to open pipe\n");
    end(EXIT_FAILURE);
}

Jetzt funktioniert dies perfekt (für einen anderen Teil der Zuordnung, die die MD5 für eine Datei erhalten muss), aber ich kann nicht trainieren, wie eine Zeichenfolge in es zu verlegen.

Wenn ich es richtig verstehe, muss ich etwas tun wie:

FILE * file = popen("/bin/cat", "w");
fwrite("hello", 5, file);
pclose(file);

Das würde, denke ich, cat ausführen und "hallo" über StdIn an es übergeben. Ist das richtig?

0 Stimmen

Haben Sie den zweiten Blockcode ausgeführt? Dann wüssten Sie, dass fwrite einen weiteren Parameter benötigt, nämlich die Größe eines Elements Ihrer Zeichenkette. Sie hätten also wahrscheinlich fwrite("hello",sizeof(char),5,file); ausprobiert und festgestellt, dass dies tatsächlich funktioniert. Ob Sie es auf diese Weise tun sollten oder durch einen Aufruf von pipe() und dann fork() ein Kind, schließen Sie die Enden der Pipe, und senden Sie Informationen mit einem write() und sprintf() ist eine andere Idee.

2voto

Jonathan Leffler Punkte 694013

Wenn Sie eine Zeichenkette in die md5 Programm, dann müssen Sie wissen, welche Optionen Ihr md5 Programm arbeitet mit.

  • Wenn es explizit eine Zeichenkette in der Befehlszeile benötigt, dann verwenden Sie diese:

    md5 -s 'string to be hashed'
  • Wenn es die Standardeingabe verwendet, wenn kein Dateiname in der Befehlszeile angegeben ist, dann verwenden Sie:

    echo 'string to be hashed' | md5
  • Wenn es unbedingt auf einen Dateinamen besteht und Ihr System die /dev/stdin o /dev/fd/0 dann verwenden:

    echo 'string to be hashed' | md5 /dev/stdin
  • Trifft keiner der oben genannten Punkte zu, dann müssen Sie eine Datei auf der Festplatte erstellen und md5 und löschen Sie die Datei anschließend:

    echo 'string to be hashed' > file.$$; md5 file.$$; rm -f file.$$

0 Stimmen

+1, mit der Bemerkung, dass das Programm auf einigen Systemen als md5sum .

1voto

prelic Punkte 4280

Siehe meinen obigen Kommentar:

FILE* file = popen("/sbin/md5","w");
fwrite("test", sizeof(char), 4, file);
pclose(file);

ergibt eine md5-Summe

0 Stimmen

Ok, aber wie bekomme ich die Zeichenfolge ZURÜCK - im Moment, Ihr Code funktioniert, aber es druckt es auf dem Bildschirm - ich brauche, um es zurück als eine char*

0voto

xscott Punkte 2320

Versuchen Sie dies:

static char command[256];
snprintf(command, 256, "md5 -qs '%s'", "your string goes here");
FILE* md5 = popen(md5, "r");
static char result[256];
if (fgets(result, 256, md5)) {
     // got it
}

Wenn Sie wirklich in die stdin von md5 schreiben und dann von der stdout von md5 lesen wollen, werden Sie wahrscheinlich nach einer Implementierung von popen2(...) suchen wollen. Das ist aber normalerweise nicht in der C-Bibliothek enthalten.

0 Stimmen

Char* get_string_md5(char* data) { static char command[256]; snprintf(command, 256, "md5 -qs '%s'", data); FILE* md5 = popen(md5, "r"); static char result[256]; if (fgets(result, 256, md5)) { return result; } printf("FEHLER: MD5-Hash konnte nicht erzeugt werden \n "); end(EXIT_FAILURE); } Funktioniert nicht :(

0 Stimmen

@larsmans: Es würde mit dem unter MacOS X 10.6.5 verfügbaren /sbin/md5 funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X