Когда я вызываю /usr/local/bin/pdftk
из PHP в Apache (через shell_exec()
, exec()
, system()
, и т. Д. ), он возвращает сообщение SYNOPSIS, как и ожидалось.
Когда я звоню /usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten
через shell_exec()
, ничего не возвращается.
Когда я копирую и вставляю точно такую же строку в тот же путь в оболочке (как пользователь apache), файл output.pdf генерируется, как и ожидалось.
Перемещение команды pdftk
в сценарий оболочки PHP (shebang #!/usr/bin/php
) и ее выполнение с php script.php
работает отлично.
Вызов этого сценария оболочки (с перенаправлением его stderr на stdout) из PHP в Apache (через shell_exec(script.php);
) приводит к следующей строке:
sh: line 1: 32547 Segmentation fault /usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten 2>&1
Всякий раз, когда я запускаю скрипт из командной строки (через PHP или напрямую), он работает нормально. Всякий раз, когда я запускаю скрипт через PHP через Apache, он либо завершается сбоем без какого-либо уведомления, либо выдает SegFault, указанный выше.
Это PHP 4.3.9 на RHEL4. Пожалуйста, не стреляйте в меня. Я установил память на 512M с помощью ini_set () и убедился, что пользователь apache имел права на чтение / запись для всех путей (с помощью fopen ()) и вошел в систему как apache ...
Просто пошел и проверил / var / log / messages, чтобы найти это:
Oct 4 21:17:58 discovery kernel: audit(1286241478.692:1764638):
avc: denied { read } for pid=32627 comm="pdftk" name="zero"
dev=tmpfs ino=2161 scontext=root:system_r:httpd_sys_script_t
tcontext=system_u:object_r:zero_device_t tclass=chr_file
ПРИМЕЧАНИЕ: Отключение SELinux "устранило" проблему. Это перешло в вопрос ServerFault? Кто-нибудь может дать мне 30-секундный учебник по контролю доступа SELinux?