当我/usr/local/bin/pdftk
从 Apache 中的 PHP 调用时(通过shell_exec()
、exec()
、system()
等),它会按预期返回 SYNOPSIS 消息。
当我调用/usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten
viashell_exec()
时,没有任何返回。
当我将完全相同的字符串复制并粘贴到 shell 中的相同路径(作为 apache 用户)时,将按预期生成 output.pdf 文件。
将pdftk
命令移动到 PHP shell 脚本 (shebang is #!/usr/bin/php
) 并php script.php
完美地执行它。
从 Apache 中的 PHP(通过)调用该 shell 脚本(其标准错误重定向到标准输出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 或直接)运行脚本时,它都可以正常工作。每当我通过 Apache 通过 PHP 运行脚本时,它要么在没有任何通知的情况下失败,要么给出上面列出的 SegFault。
它是 RHEL4 上的 PHP 4.3.9。请不要射击我。我已使用 ini_set() 将内存设置为 512M,并确保 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 访问控制入门吗?