Команда PHP не выполняется system(), exec() или passthru()

Я пытаюсь запустить преобразование файла командной строки, используя open office.

openoffice pdf filename.doc 2>&1

когда я запускаю в командной строке от имени пользователя root, он отлично работает, и файл преобразуется. Однако, когда я передаю указанную выше команду в файле PHP от имени пользователя apache, она не выполняется.

Я попробовал все три выполнения командной строки PHP:

$command_output=system($command_line,$rtnval);
$command_output=exec($command_line,$rtnval);
$command_output=passthru($command_line,$rtnval);

Также,

echo print_r($rtnval); 
echo print_r($command_output);

$rtnval возвращает 1 и $command_output 1. Я сбит с толку, не зная, какой ответ linux (centos) на переданную выше команду. Это очень расстраивает, потому что я не могу знать, какова реакция системы, когда я пытаюсь выполнить команду.

Я также включил разрешение /etc/suders для apache на запуск команды open office.

Apache ВСЕ: (ВСЕ) NOPASSWD: /path/to/openoffice

по-прежнему команда не выполняется в PHP от имени пользователя apache.

Чего мне не хватает, чтобы PHP как пользователь apache не выполнял эту команду?


person user914425    schedule 21.11.2011    source источник
comment
Вы пробовали это в командной строке как пользователь Apache?   -  person Pekka    schedule 22.11.2011
comment
Какую команду вы пытаетесь запустить? Также вы можете вывести вывод ошибки, используя 2› error.txt   -  person jakx    schedule 22.11.2011
comment
Вы пробовали другие команды, кроме «openoffice»? Я бы порекомендовал подать заявку на apache и попытаться запустить команду, просто чтобы исключить любые проблемы.   -  person Jonathan    schedule 22.11.2011
comment
Джонатан, можете ли вы предоставить образец для su-ing для apache? Может кто-нибудь объяснить эту команду: // $wv_command_output = passthru(touch /root/temp.tmp | sudo /usr/bin/php -f /util/wvPDF.php);   -  person user914425    schedule 22.11.2011


Ответы (3)


Возможно, openoffice отсутствует в PATH. Попробуйте выполнить его с полным путем.

person Karoly Horvath    schedule 21.11.2011
comment
Я указал путь к openoffice. Я получаю где-то, где я меняю команду на: sudo /path/to/openoffice/openoffice pdf filename.doc 2›&1 я получаю следующий вывод командной строки: sudo: извините, у вас должен быть tty для запуска sudo - person user914425; 22.11.2011

Чтобы запустить вашу команду, как если бы вы были пользователем apache, просто попробуйте это в оболочке:

# switch to superuser
sudo su -
# then switch to the apache user
su - www-data

Вы окажетесь в достаточно ограниченной оболочке, из которой обычно невозможно запустить openoffice. Действительно, для этого требуется много среды, которую в любом случае было бы небезопасно полностью настраивать для apache.

Насколько я знаю, лучше создать выделенного пользователя, которому разрешено запускать вашу команду (например, обычного пользователя «www-runner»), а затем «su» для него из PHP. Другие меры безопасности включают в себя chroot-доступ пользователя, лишенного прав, или использование apparmor для ограничения того, что и где ему разрешено запускать. В любом случае никогда не позволяйте www-data запускать что-либо от имени пользователя root, добавляя www-data в sudoers: это слишком опасно!

Вы также можете взглянуть на libapache2-mod-suphp (модуль suid apache для запуска php-скриптов с разрешениями владельца). Его проще использовать, чем выделенный suEXEC apache beast (http://httpd.apache.org/docs). /2.0/suexec.html). Последнее действительно не для быстрого решения;)

person MoonSilex    schedule 24.02.2012

Вполне возможно, что ваш php в апаче работает в безопасном режиме или как он называется, в котором функция system() и тому подобное отключены.

Этот ответ на самом деле предполагает, что то, что вы называете «работой от имени пользователя apache», на самом деле работает в среде apache, какой бы она ни была.

person Michael Krelin - hacker    schedule 21.11.2011
comment
Майкл, не могли бы вы пояснить разницу между запуском в качестве пользователя apache и средой apache? Кстати, системная команда работает с другой командой ghostscript, такой как gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg3 -sOutputFile=${input_file_tif} -f $input_file. Можете ли вы объяснить, почему print_r($command_output) возвращает только 1? - person user914425; 22.11.2011
comment
Если это работает для другой команды, то это не так (запуск cli php от имени пользователя apache — это не то же самое, что запуск скрипта из модуля apache php, fastcgi или cgi — все они могут использовать разные файлы конфигурации). - person Michael Krelin - hacker; 22.11.2011