2010-11-27 45 views
4

Im travaillant dans c (plus ou moins pour la première fois) pour uni, et j'ai besoin de générer un MD5 à partir d'un tableau de caractères. L'affectation spécifie que cela doit être fait en créant un canal et en exécutant la commande md5 sur le système.Comment puis-je insérer une chaîne dans une commande popen() dans C?

Je suis arrivé jusqu'ici:

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); 
} 

Maintenant, cela fonctionne parfaitement (pour une autre partie de la mission qui a besoin d'obtenir le MD5 pour un fichier) mais je ne peux pas l'entraînement comment diriger une chaîne en elle .

Si je comprends bien, je dois faire quelque chose comme:

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

Ce qui, je pense, exécuterait chat et de passer « Bonjour » par StdIn. Est-ce correct?

+0

Avez-vous exécutez ce deuxième code de bloc? Si vous aviez, vous vous rendrez compte que fwrite prend un autre paramètre, qui est la taille d'un élément de votre chaîne, donc vous auriez probablement essayé fwrite ("hello", sizeof (char), 5, fichier); et a constaté que cela fonctionne vraiment. Que vous soyez ou non censé le faire de cette façon ou par un appel à pipe() puis fork() un enfant, fermez les extrémités du pipe, et envoyez des infos avec write() et sprintf() est une idée différente . – prelic

Répondre

2

Si vous avez besoin pour obtenir une chaîne dans le programme md5, alors vous devez savoir quelles sont les options de votre programme md5 fonctionne avec.

  • Si elle prend une chaîne explicitement sur la ligne de commande, utilisez alors que:

    md5 -s 'string to be hashed' 
    
  • Si elle prend l'entrée standard si aucun nom de fichier est donné sur la ligne de commande, utilisez:

    echo 'string to be hashed' | md5 
    
  • Si elle veut absolument un nom de fichier et votre système prend en charge /dev/stdin ou /dev/fd/0, utilisez:

    echo 'string to be hashed' | md5 /dev/stdin 
    
  • Si aucune de ces appliquer, alors vous devrez créer un fichier sur le disque, exécutez md5 sur, puis supprimer le fichier après:

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

+1, avec la remarque que sur certains systèmes, le programme s'appelle 'md5sum '. –

0

Essayez ceci:

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 
} 

Si vous voulez vraiment écrire à stdin de md5, puis lire la sortie standard de md5, vous allez probablement vouloir regarder autour pour une mise en œuvre de popen2 (.. .). Ce n'est normalement pas dans la bibliothèque C.

+0

Pour quel programme 'md5' cette syntaxe de ligne de commande est-elle valide? –

+0

char * get_string_md5 (données char *) { static char command [256]; snprintf (commande, 256, "md5 -qs '% s'", données); FICHIER * md5 = popen (md5, "r"); statique char résultat [256]; if (fgets (résultat, 256, md5)) { renvoie le résultat; } printf ("ERREUR: impossible de générer le hachage MD5 \ n"); end (EXIT_FAILURE); } travail ne marche pas :( – Ash

+0

@larsmans: il travaillerait avec le/sbin/md5 disponible sur MacOS X 10.6.5 –

1

Voir mon commentaire ci-dessus:

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

produit une somme md5

+0

J'était « une sorte de » bonne voie en Ontario, il – Ash

+0

ok, mais comment puis-je.. la chaîne BACK - pour le moment, votre code fonctionne, mais il l'imprime à l'écran - je dois le récupérer en tant que 'char *' – Ash