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

标签 c windows apache batch-file cgi

基本上,我用 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 命令,它也会失败。

  • 批处理文件本身运行正常。
  • 在命令行上运行 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.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 - 如何在用 C 编写的 CGI 应用程序中使用系统命令执行批处理脚本,通过 Web 浏览器(Apache 服务器)执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927711/

相关文章:

c - 用一个指针对链表进行冒泡排序

c - 如何检查是否在 C Linux 中收到 UDP 数据包

c++ - 如何将 'this'指针传递给C++ WinAPI线程?

windows - 如何在 Git Bash 中使用 Windows 网络路径

apache - 将除一页以外的所有页面重定向到错误 503 自定义页面

c - 尝试扫描字符串时程序崩溃

c - 如何在客户端处理传统 OCSP 和 OCSP 装订

windows - 使用 "SupressWhenMinimzed"安全关闭 RDP session 后,远程计算机的屏幕分辨率发生变化

apache - Weblogic 桥消息 - 服务器 APACHE 桥失败 :

java - 如何在 spring boot 应用程序中检查嵌入式 tomcat 的健康状况?