将C字符串传递给linux命令行

时间:2011-10-11 14:01:35

标签: c pointers exec command-line-arguments

我的函数中有一个字符串,如..

 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 个答案:

答案 0 :(得分:4)

我认为您正在寻找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);

答案 1 :(得分:3)

您应该学习使用openssl API而不是调用命令行。

如果失败,你需要使用system,而不是fork。

答案 2 :(得分:2)

如果你想写字符&#34;在C字符串中,您可以使用\&#34;

编写它

所以,你写了

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

答案 3 :(得分:0)

怎么样:

 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

  }

答案 4 :(得分:0)

另一种选择:

void func(char * key)
{
    char cmd[255] = "openssl dgst -md5 -hmac ";
    assert(sizeof cmd > strlen(cmd) + strlen(key));
    strcpy(cmd, key);
    system(cmd);
}