【问题标题】:running multiple commands using popen in c在 c 中使用 popen 运行多个命令
【发布时间】:2014-04-25 09:09:29
【问题描述】:

我正在使用 C 创建一个程序,该程序在需要运行多个这样的命令的 linux 环境中运行

sudo -s

ls

密码

(假设sudo -s下的命令是需要超级用户才能运行的命令)

现在,我需要做的是获取这些命令的所有输出以进行进一步处理。 这是代码

int executeCommand(char *command, char *result)
{
    /*This function runs a command./*/
    /*The return value is the output of command*/

    int nSuccess = -1;
    FILE * fp = NULL;
    char buffer[1035];

    if (command == NULL)
        render("Command is null");

    if (result == NULL)
        render("result is null");
    if (command!=NULL && result!=NULL)
    {
        fp=popen("sudo -s","w");
            fwrite ( " ls", 1, 3, fp);
            fwrite ( " pwd", 1, 4, fp);
        if(fp!=NULL)
        {
            strcpy(result,"\0");
            while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL)
            {
                strcat(result,buffer);
            }
            pclose(fp);
        }   nSuccess=0;

    }

    return nSuccess;
}

问题是我如何能够执行 ls 和 pwd 然后得到它的输出?谢谢你:)

【问题讨论】:

    标签: c linux popen


    【解决方案1】:

    正式来说,你的帖子里没有问题,但是

    1. 如果您的问题是lspwd 没有被sudo -s 执行:尝试在fwrite()s 中添加一个换行符(就像您在shell 中输入的一样):

       fwrite ( "ls\n", 1, 3, fp);
       fwrite ( "pwd\n", 1, 4, fp);
      

      (命令前的" " 不是必需的)

    2. 在检查fp之前不要打电话给fwrite()

    3. 如果你打电话给fp=popen("sudo -s","w");,你不能使用fp来阅读。 while(fgets(buffer, sizeof(buffer)-1,fp)!=NULL) 不起作用。如果你想通过管道将命令 to sudo 并且 想读取输出,你需要两个管道让事情变得更复杂,或者你可以重定向 @987654333 @ 的输出到一个临时文件,然后读取:

      char tmpfile[L_tmpnam];
      char cmd[1024];
      tmpnam( tmpfile );
      sprintf( cmd, "sudo -s >%s", tmpfile );
      fp = popen( cmd, "w" );
      ....
      pclose(fp);
      
      FILE *ofp = fopen( tmpfile, "r" );
      if( rfp != null ) {
          while(fgets(buffer, sizeof(buffer)-1,rfp)!=NULL)
          {
              strcat(result,buffer);
          }
          fclose( rfp );
          remove( tmpfile );
      }
      

    【讨论】:

    • 您在第二条中说过在检查 fp 之前不要调用 fwrite,那么除了第一个命令之外,我将如何执行其他命令?在 no.3 中,简单地说,模式 'r' 意味着您可以读取命令的输出,模式 'w' 意味着您可以写入第一个命令的输出但您没有选择读取它吗?谢谢
    • no.2: 如果fp == NULL 启动sudo 失败了,那么写什么也没用。到它的标准输入,但fwrite() 可能会崩溃
    • no.3 popen)() 确实没有像 "rw" 这样的选项,它允许您将数据通过管道传输到命令的 stdin 并读取其 stdout
    • 在这种情况下,是否可以从标准输出中读取?这样我仍然可以获得我需要的输出?
    • 在您的情况下,重定向sudo 的输出并在之后对其进行重载可能是最简单的解决方案。我在我的答案中添加了一些示例代码。否则,您需要两个管道并且必须调用fork()exec..()dup2()。如果您搜索这些命令,您将在 SO 中找到示例
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多