/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
経由で呼び出すとshell_exec()
、何も返されません。
まったく同じ文字列をコピーしてシェルの同じパスに (apache ユーザーとして) 貼り付けると、output.pdf ファイルが期待どおりに生成されます。
pdftk
コマンドを PHP シェル スクリプト (shebang is ) に移動し#!/usr/bin/php
て実行すると、php script.php
完全に機能します。
そのシェル スクリプトを (stderr を stdout にリダイレクトして) Apache の PHP から ( 経由で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 アクセス制御の入門書をここで教えてもらえますか?