【问题标题】:Pass a variable to popen command将变量传递给 popen 命令
【发布时间】:2012-06-24 12:00:30
【问题描述】:

我需要将一个字符串变量传递给我为解密一段加密数据而创建的 popen 命令。我需要使用的代码段是:

char a[]="Encrypted data";
popen("openssl aes-256-cbc -d -a -salt <a-which is the data i have to pass here>","r");

我应该怎么做才能将此变量传递给命令。我试过了:

popen("openssl aes-256-cbc -d -a -salt %s",a,"r");

但在编译时显示错误,popen 传递了太多参数。请帮忙。提前致谢。 操作平台:Linux

【问题讨论】:

    标签: c linux terminal openssl popen


    【解决方案1】:

    如果参数包含任何空格、引号或其他特殊字符,使用snprintf 构造命令字符串将中断。

    在 Unix 平台上,您应该改用 pipe 创建管道,然后使用 posix_spawnp 启动子进程,使用 posix_spawn_file_actions_adddup2 将子进程的标准输出连接到管道的输入端。

    【讨论】:

      【解决方案2】:

      使用snprintf 构造传递给popen 的命令字符串。

      FILE * proc;
      char command[70];
      char a[]="Encrypted data";
      int len;
      len = snprintf(command, sizeof(command), "openssl aes-256-cbc -d -a -salt %s",a);
      if (if len <= sizeof(command))
      {
          proc = popen(command, "r");
      }
      else
      {
          // command buffer too short
      }
      

      【讨论】:

      • 写一个终止 NUL 的任何具体原因,什么时候 snprintf 会这样做?
      • 根据(适当的)cmets 编辑。
      • snprintf 在缓冲区太短时不会返回 -1。您还需要将其返回与缓冲区大小进行比较,而不仅仅是检查错误返回。