Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DOS批处理脚本中的子进程输出在Apache中不可见_Apache_Batch File - Fatal编程技术网

DOS批处理脚本中的子进程输出在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

我正在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
如果直接从命令提示符执行,所有三行文本将显示在控制台中。但是,如果脚本是从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^>