Вывод подпроцессов в пакетном скрипте DOS не виден в Apache - PullRequest
3 голосов
/ 31 января 2010

Я использую Apache 2.2 (запускается через консоль) в Vista. У меня есть простой пакетный скрипт в cgi-bin. К сожалению, 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)

Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 14 октября 2014

Помимо многих других деталей, это происходит, когда cmd вызывается через CreateProcess() с DETACHED_PROCESS, что и делает Apache в ap_cgi_build_command() - apr_proc_create() (ссылка на исходный код Apache 2.2.25).

По какой-то причине дочерние процессы из cmd также порождаются отсоединенными. Это также происходит в других ситуациях (например, вызывая WScript.CreateObject("WScript.Shell").Run() в том же контексте), которые могут включать или не включать cmd в фоновом режиме.

Несоответствующий извлеченный урок: если CreateObject(DETACHED_PROCESS) и перенаправление ввода / вывода (STARTF_USESTDHANDLES) смешаны вместе, результаты могут быть неожиданными.

Насколько я знаю, нет другого решения, кроме как избежать партии, WSH и других. Команда httpd может обойти это в будущем.

0 голосов
/ 31 января 2010

Может быть, вам нужно перенаправить вывод на ваш STDOUT. Я не пробовал это на машине с Windows, но вы можете попробовать

cmd /c echo Hidden from browser >&1

или перенаправьте его во временный файл и вызовите type для файла.

0 голосов
/ 05 апреля 2013

Я смотрел на это, по адресу: Передача вывода Java в вызывающий скрипт

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^>
0 голосов
/ 31 января 2010

Это будет работать из командной строки, как и ожидалось, но какие приложения вы пытаетесь запустить в Apache cgi-bin? Я не слышал, чтобы cgi-bin в Apache был командным файлом ... и это может быть потенциальным эксплойтом ... возможно, не установлены разрешения для командного файла ... или что для Apache нет доступного плагина для выполните командный файл, подумайте о обработчиках модов, используемых для ssl (уровень защищенных сокетов) ... как этот пример, найденный в файле конфигурации Apache ... httpd.conf

<LoadModule ssl_module modules/mod_ssl.so>
....
<if mod_ssl>
....
</if>

Это объясняет, почему вы не можете запустить командный файл как скрипт cgi-bin ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...