如何在用 C 编写的 CGI 应用程序中使用系统命令执行批处理脚本,通过 Web 浏览器(Apache 服务器)执行

How to execute a batch script using system command in a CGI application written in C, executed through web browser (Apache Server)

基本上,我用 C 编写了一个 CGI 脚本,其中包含一个 system() 函数,该函数应该在 EXE 所在的服务器上调用一个批处理文件。我写的示例代码如下:-

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

int main()
{
    //system("ROBOCOPY \pdffiles \\10.6.202.88\d$\pdffiles /mov /ZB /XJ /FFT /MT /R:2 /W:5 /V");

    int t = 0;
    t= system("PDF_MOVE.bat");

    if(t == -1)
        {
            printf("file copy failure");
        }
        else
        {
            printf("file copy successfull");
        }

    return 0;
}

我编译这段代码后,将生成的.exe文件放在Apache服务器的一个文件夹中。

然后,当我尝试通过在浏览器中输入 exe 的完整路径(即 http://10.6.202.111/path/to/file_copy_test.exe)从 Web 浏览器访问该 exe 时。这要么尝试下载 .exe 文件,要么给我一个内部服务器错误 (500)。批处理文件包含我在代码中注释的 robocopy 命令。另外,如果我直接尝试通过系统命令 运行 robocopy 命令,它也会失败。

我该怎么做才能解决这个问题,是否需要更改任何 Apache 设置?。文件夹的路径需要更改吗?我试过将 ./ 放在批处理文件名的前面,但它在命令行上失败为“。”无法识别。

Apache 错误日志显示:

[cgi:error] [pid 10604:tid 1512] [client 172.24.2.82:56507] AH01215: 可运行的程序或批处理文件。\r: D:/itrade/app/user/file_copy_test.exe


进行建议的更改后,我意识到为 Robocopy 命令提供的源路径和目标路径不正确。修复最终使其工作。

我使用的批处理文件:-

@echo off
(
net use \10.6.202.88\d$ /user:Username password
ROBOCOPY D:\path\to\pdffiles \10.6.202.88\d$\pdffiles /ZB /COPYALL /mov /XJ /FFT /MT /R:2 /W:5 /v /tee /log:robocopy_log.txt
EXIT
) >output.txt 2>&1

确保通过将此添加到 VistualHost 文件或 .htaccess 文件来允许执行 cgi(参见:https://www.devside.net/wamp-server/running-exe-and-batch-files-as-cgi-scripts-in-apache-under-windows

AddHandler cgi-script .bat # add .exe if you wish
Options +ExecCGI +FollowSymlinks

以及为什么要使用 C 程序/.exe 来执行批处理文件?这个批处理文件也应该可以解决问题(老实说我没有测试过):

@echo off
echo Content-Type: text/html
echo.
CALL PDF_MOVE.bat || goto error
echo file copy successfull
goto :EOF
:error
echo file copy failure

我们不知道批处理文件输出什么,但是您的 C 代码缺少符合 CGI 标准的一个至关重要的东西 - 一个 HTTP header。

您需要输出的最低限度是 Content-Type,因为您不希望输出任何 HTML,所以最好是 "text/plain"。 header 以空行结束。

printf("Content-Type: text/plain\n\n");

否则,Apache 会将您输出的任何内容视为 header 和 return,如果它不理解它,则会出现错误 500。

Configuration-wise,Apache 需要被告知 CGI "scripts" 存在于您尝试 运行 的文件夹中,并且它们具有什么扩展名。

Options +ExecCGI
AddHandler cgi-script .exe

如果您允许 "users" 使用 Options 覆盖 Options 指令,则可能需要在 <Directory ...> 块或“.htaccess”中的主要 apache 配置中=14=]

可执行文件还需要 Apache 读取和执行的权限。