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



基本上,我用C编写了一个CGI脚本,其中包含一个系统()函数,该函数应该调用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)。这要么试图下载.exe文件,要么给我一个内部服务器错误(500)。批处理文件包含我在代码中注释的robocopy命令。此外,如果我直接尝试通过系统命令运行robocopy命令,它也会失败。

  • 批处理文件本身运行正常
  • 在命令行上运行robocopy命令可以正常工作
  • 如果我通过双击直接执行.exe文件,那么它可以正常工作并正确调用批处理文件
  • 只有当尝试通过浏览器执行.exe时,此代码才会失败

如果需要更改任何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.88d$ /user:Username password
ROBOCOPY D:pathtopdffiles \10.6.202.88d$pdffiles /ZB /COPYALL /mov /XJ /FFT /MT /R:2 /W:5 /v /tee /log:robocopy_log.txt
EXIT
) >output.txt 2>&1

通过将cgi添加到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头。

您需要输出的最低限度是内容类型,因为您不希望输出任何HTML,所以它可能是"text/plain"。标题以空行结束。

printf("Content-Type: text/plainnn");

如果没有这一点,Apache将把你输出的任何东西都当作头,如果它不理解,就会返回错误500

在配置方面,Apache需要被告知CGI"脚本"存在于您尝试运行它的文件夹中,以及它们的扩展名。

Options +ExecCGI
AddHandler cgi-script .exe

如果您允许"用户"使用AllowOverride Options覆盖Options指令,那么它可能需要在<Directory ...>块内的主apache配置中,或者在".htaccess"中

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

最新更新