DOS批处理脚本中的子进程输出在Apache中不可见
我正在Vista上运行Apache2.2(通过控制台启动)。我在CGIBIN中有一个简单的批处理脚本。不幸的是,Apache似乎不提供子进程生成的任何内容 例如,给定以下脚本:DOS批处理脚本中的子进程输出在Apache中不可见,apache,batch-file,Apache,Batch File,我正在Vista上运行Apache2.2(通过控制台启动)。我在CGIBIN中有一个简单的批处理脚本。不幸的是,Apache似乎不提供子进程生成的任何内容 例如,给定以下脚本: @echo off echo Content-Type: text/html echo. echo Visible in browser cmd /c echo Hidden from browser echo End of script 如果直接从命令提示符执行,所有三行文本将显示在控制台中。但是,如果脚本是从Apa
@echo off
echo Content-Type: text/html
echo.
echo Visible in browser
cmd /c echo Hidden from browser
echo End of script
如果直接从命令提示符执行,所有三行文本将显示在控制台中。但是,如果脚本是从Apache启动的,则中间行(“从浏览器隐藏”)不会出现
这个脚本只是说明性的——我实际上使用批处理文件来启动一些单独的基于控制台的应用程序(不是cmd.exe)
我做错了什么?它可以从命令行正常工作,但您试图在apache的cgi bin中运行的应用程序是什么?我没有听说Apache的cgi bin是一个批处理文件……这可能是一个潜在的漏洞……可能是批处理文件的权限没有设置……或者Apache没有插件可以实际执行批处理文件,想想用于ssl(安全套接字层)的mod handlers…就像Apache的配置文件中的示例一样…httpd.conf .... ....
这将解释为什么不能将批处理文件作为cgi bin脚本运行…可能需要将输出重定向到STDOUT。我还没有在Windows机器上试用过,但你可以试试
cmd /c echo Hidden from browser >&1
或者将其重定向到一个临时文件,并在该文件上调用
键入。我一直在看这个,在:
FWIW,所有这些C:\wamp\bin\apache\apache2.2.22\cgi-bin\testbat.bat
的echo
输出同时出现在命令窗口和服务的网页中:
@echo off
rem This works in Wampserver's Apache cgi-bin...
rem http://localhost/cgi-bin/testbat.bat
echo Content-Type: text/html
echo.
echo ^<html^>^<head^>^</head^>^<body^>
echo ^<H1^>Hello world!!!^</H1^>
echo ^<PRE^>
FOR /F "usebackq delims==" %%i IN (`dir`) do echo %%i
echo ^</PRE^>
FOR /F "usebackq delims==" %%i IN (`cmd /c echo NOT hidden!`) do echo %%i
echo ^</body^>^</html^>
@echo关闭
rem这在Wampserver的ApacheCGI中工作。。。
雷姆http://localhost/cgi-bin/testbat.bat
echo内容类型:text/html
回声。
回音^^^^
回声^你好,世界^
回音^
对于(`dir`)中的/F“usebackq delims==”%%i,执行echo%%i
回音^
对于/F“usebackq delims==”%%i IN(`cmd/c echo NOT hidden!`),执行echo%%i
回音^^
除了更多细节,当通过CreateProcess()
和分离的进程调用cmd
时,就会发生这种行为,这就是Apache在ap\u cgi\u build\u命令()
中通过apr\u proc\u create()
执行的操作(参考Apache 2.2.25源代码)
由于某种原因,cmd
中的子进程也会分离产生。在其他情况下也会发生这种情况(例如,在同一上下文中调用WScript.CreateObject(“WScript.Shell”).Run()
),这些情况可能涉及后台的cmd
学到的无关经验教训:如果CreateObject(分离的\u进程)
和I/O重定向(STARTF\u USESTDHANDLES
)混合在一起,结果可能会令人惊讶
据我所知,除了避免批处理、WSH和其他方法之外,没有其他解决方案。httpd
团队可能会对此进行研究,以便在将来找到解决办法。使用批处理是错误的。在您自己的进程中使用Perl、PHP、Ruby或Python(甚至是vbscript-asp)@Johannes Rössel echo,但在子进程中运行的那个呢?
@echo off
rem This works in Wampserver's Apache cgi-bin...
rem http://localhost/cgi-bin/testbat.bat
echo Content-Type: text/html
echo.
echo ^<html^>^<head^>^</head^>^<body^>
echo ^<H1^>Hello world!!!^</H1^>
echo ^<PRE^>
FOR /F "usebackq delims==" %%i IN (`dir`) do echo %%i
echo ^</PRE^>
FOR /F "usebackq delims==" %%i IN (`cmd /c echo NOT hidden!`) do echo %%i
echo ^</body^>^</html^>