Передача символьной строки C в командную строку Linux - PullRequest
0 голосов
/ 11 октября 2011

В моей функции есть строка, определенная как ..

 char *key="anyvalue";

Теперь я использую команду Linux как ...

 $openssl dgst -md5 -hmac "anyvalue" file.txt

Теперь проблема в том, что мне нужно выполнить следующую задачу через функцию C. ..

Вот код ...

  void func (char *key) {

     char *key_new=key;

     system("openssl -dgst md5 -hmac <got stuck here> file.txt");

  }

Как я могу передать значение ключа в часть labled ??

Я сделал это довольно просто в php. ...

   $key="somevalue"

   exec("openssl -dgst md5 -hmac $key file.txt");

Есть ли что-то похожее в C ???

Если нет, то, пожалуйста, скажите мне другой возможный способ ???

Ограничение:

Ключ должен быть пропущен через функцию.

Я не могу принять это как аргумент командной строки C.

Редактировать:

Я попробовал с этим ... но прежде всего я хотел бы отметить, что это небольшой файл в большом проекте и предупреждение рассматривается как ошибка ... поэтому мне нужно позаботиться и о них

Вот что я сделал -

    char *sstring=NULL;
    sprintf(sstring, "openssl dgst -md5 -hmac \"%s\"
    -out data3.md5 data3.txt",(char *)key);
    system(sstring);

если я не буду инициализироваться, тогда приходит предупреждение ..

    gcc -o hmacmd5.so -I.. -fPIC -fsigned-char -pipe -Wall 
    -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wnested-externs
    -Winline -Werror -g -Wcast-align -DSENDIP_LIBS=\"/usr/local/lib/sendip\"
    -shared hmacmd5.c ../libsendipaux.a ../libsendipaux.a

    cc1: warnings being treated as errors
    hmacmd5.c: In function ‘xoricv’:
    hmacmd5.c:271:9: error: ‘sstring’ is used uninitialized in this function
    make: *** [hmacmd5.so] Error 1

Ответы [ 5 ]

4 голосов
/ 11 октября 2011

Я думаю, что вы ищете sprintf:

int sprintf(char *STR, const char *FORMAT, ...);

В вашем случае вы бы использовали его следующим образом:

sprintf(some_allocated_output_string, "openssl -dgst md5 -hmac %s", key);
system(some_allocated_output_string);

РЕДАКТИРОВАТЬ:

После просмотра кода, который вы пробовали, я вижу, что не дал вам полного ответа.

У вас есть два варианта здесь (предположим, что STRING_SIZE ниже - это некоторый #defined размер, вроде 300 или что-то):

1) использовать предварительно выделенный буфер:

char sstring[STRING_SIZE];
sprintf(sstring, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
system(sstring);

2) использовать malloc / free:

#include <stdlib.h>
//blah blah blah
char *sstring=NULL;
//blah blah blah
sstring = malloc(STRING_SIZE);
sprintf(sstring, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
system(sstring);
free(sstring);

Я бы предложил первыйподход.Наряду с этим, я бы настоятельно рекомендовал позаботиться о том, чтобы @ pmg предложил snprintf, если ваш компилятор его поддерживает.Это будет выглядеть так:

char sstring[STRING_SIZE];
int result = 0;
result = snprintf(sstring, STRING_SIZE, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
// Perform a check on result here, in case you ran out of space.
// If result > STRING_SIZE, you need to try a larger buffer.
system(sstring);
3 голосов
/ 11 октября 2011

Вы должны научиться использовать API openssl вместо вызова командных строк.

В противном случае вам нужно использовать system, а не fork.

2 голосов
/ 11 октября 2011

Если вы хотите написать символ "внутри строки C, вы можете написать его с помощью \"

Итак, вы пишете

system("openssl dgst -md5 -hmac \"key\" file.txt");

Если ваш ключ не является константой, вы должны использовать snprintf

Примерно так:

char buffer[/*enough size*/];
snprintf(buffer, /*the size*/, "openssl dgst -md5 -hmac \"%s\" file.txt", key);

и после

system(buffer);
0 голосов
/ 11 октября 2011

Другая альтернатива:

void func(char * key)
{
    char cmd[255] = "openssl dgst -md5 -hmac ";
    assert(sizeof cmd > strlen(cmd) + strlen(key));
    strcpy(cmd, key);
    system(cmd);
}
0 голосов
/ 11 октября 2011

Как насчет:

 void func (char *key) {

     char *cmd = "openssl -dgst md5 -hmac ";
     char *fullmsg = _malloc( strlen(key) + strlen(cmd) );
     if (fullmsg != NULL) {
       sprintf_s( fullmsg, sizeof(fullmsg), "%s%s", cmd, key );
       system( fullmsg );
       free( fullmsg );
     } // else out of memory

  }
...