【问题标题】:System call is not working in cgi系统调用在 cgi 中不起作用
【发布时间】:2018-03-01 19:16:01
【问题描述】:

我在 fedora 中用 CGI 开始了一个新项目。这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

    printf("Content-type:text/html\r\n\r\n");

    printf("<!DOCTYPE html>\n");
    printf("<html>\n");
    printf("<title>EWN Lab</title>\n");
    printf("<meta charset=\"UTF-8\">\n");
    printf("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n");
    printf("<body class=\"w3-light-grey\">\n");

    system("ls");                 // Problem comes due to this line

    printf("</body>\n");
    printf("</html>\n");
    return 0;
}

当我使用命令行编译和执行程序时,它工作正常。但是当我尝试通过浏览器执行时,它显示 "Internal Server Error"

我使用 apache 服务器作为 Web 服务器。有谁知道通过网络浏览器运行程序时哪个用户会执行这个?

【问题讨论】:

  • 我会尝试system("echo hello") 看看system 是否有效。然后是system("pwd") 来查看您要列出的目录。当然system("whoami") 会告诉你运行程序的用户。
  • 相关信息可以在linuxforums.org/forum/programming-scripting/…找到。

标签: c linux cgi


【解决方案1】:

我自己找到了解决方案。谢谢@user3386109。由于系统命令在这里失败,我使用 pip 编写了另一个函数。现在它工作正常。

具有 var-arg 能力的函数如下所示

void system_ext(const char *format, ...) {
    char* string;
    va_list args;

    va_start(args, format);
    if(0 > vasprintf(&string, format, args)) string = NULL;
    va_end(args);

    if(string) {
        char buff[VLONG_STR_LEN] = {0};
        FILE* file = popen(string, "r");
        while(fgets(buff, VLONG_STR_LEN, file) != NULL);
        pclose(file);
        free(string);
    } else {
        printf("Error on formating string.\n");
    }
}

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多