在c程序中执行Linux命令

时间:2011-01-21 10:08:08

标签: c linux

我正在尝试使用系统系统调用在c程序中执行Linux命令,但是不希望它在终端上转储输出或错误日志。我该怎么办?还有其他办法吗?

4 个答案:

答案 0 :(得分:25)

当system()调用使用shell执行命令时,您可以将stdout和stderr重定向到/ dev / null,例如。

system("ls -lh >/dev/null 2>&1");

答案 1 :(得分:15)

popen是另一种可以做同样事情的方式:

void get_popen()
    FILE *pf;
    char command[20];
    char data[512];

    // Execute a process listing
    sprintf(command, "ps aux wwwf"); 

    // Setup our pipe for reading and execute our command.
    pf = popen(command,"r"); 

    // Error handling

    // Get the data from the process execution
    fgets(data, 512 , pf);

    // the data is now in 'data'

    if (pclose(pf) != 0)
        fprintf(stderr," Error: Failed to close command stream \n");

    return;
}

答案 2 :(得分:4)

显示代码。

试着举例:

  

系统( “LS”);

答案 3 :(得分:1)

system()popen()调用启动一个shell并将其参数传递给它,这会产生安全漏洞。除非根据shell的引用和转义规则正确清除了源自用户输入的参数的所有部分,否则攻击者可能会在系统上运行任意命令。

请使用exec系列命令。它们直接启动命令,而无需启动外壳。您可能仍需要清理输入,但仅是限制可以传递给命令本身的内容。

SEI CERT C Coding Standard中的示例:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
  
void func(char *input) {
  pid_t pid;
  int status;
  pid_t ret;
  char *const args[3] = {"any_exe", input, NULL};
  char **env;
  extern char **environ;
 
  /* ... Sanitize arguments ... */
 
  pid = fork();
  if (pid == -1) {
    /* Handle error */
  } else if (pid != 0) {
    while ((ret = waitpid(pid, &status, 0)) == -1) {
      if (errno != EINTR) {
        /* Handle error */
        break;
      }
    }
    if ((ret == 0) ||
        !(WIFEXITED(status) && !WEXITSTATUS(status))) {
      /* Report unexpected child status */
    }
  } else {
    /* ... Initialize env as a sanitized copy of environ ... */
    if (execve("/usr/bin/any_cmd", args, env) == -1) {
      /* Handle error */
      _Exit(127);
    }
  }
}