exim_mainlogから情報を抽出するbashスクリプトがあります。 puttyコマンドライン(rootとしてログイン)からbashスクリプトを実行すると、抽出されたデータが出力ファイルに正しく書き込まれます。ただし、PHP Webページからbashスクリプトを呼び出すと、grep結果は出力ファイルに書き込まれますが、exigrep結果は書き込まれません。 PHP WebページはcPanelアカウントにあります。
exim_mainlogのgrep抽出は出力ファイルに正しく書き込まれますが、exigrep抽出はそうではないので、これは権限の問題ではないようです。
これは私のPHPです:
<?php
$output=shell_exec("sh /home/account/public_html/cgi-bin/Log.sh");
?>
これはデータ抽出のために3回試みたbashスクリプトです。どちらもスクリプトが "sh /home/account/public_html/cgi-bin/Log.sh"コマンドラインを介して呼び出されると機能しますが、bashでスクリプトを実行するとgrep結果のみが記録されます(exigrep結果は記録されません)。 PHPスクリプト:
#!/bin/bash
# grep attempt consistently writes data to the temp.log file
echo "grep" > /home/account/public_html/cgi-bin/temp.log # just a label so the source of the results is known
grep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
# exigrep attempts do not work when invoked with the PHP above
echo "exigrep" >> /home/account/public_html/cgi-bin/temp.log # just a label so the file location where the exigrep results should be is known
exigrep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
exigrep --no-pager "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
また、「shell_exec」の代わりに「exec」を使用しても同じ結果が出ました。
以下のFoxのコメントに基づいて、exigrepの権限がgrepの権限と異なることを確認しました(他の人が実行できます)。
答え1
PHP呼び出しbashスクリプトが実行されない、またはexigrepの結果を提供しない問題を解決するために、/usr/sbin/exigrepにあるexigrepファイルをPHPファイルを含むローカルアカウントディレクトリにコピーしました。 bash スクリプト exigrep 呼び出しを /home/account/public_html/cgi-bin/exigrep に変更すると、ログファイルの抽出が正常に機能します。
だから少なくとも私は解決策を持っています。
私は元の問題がLinuxの問題ではなくPHPの問題であると結論付けました。何らかの理由でPHPがexigrepのシステムコピーを実行できないようです。たぶん真珠の文字という事実が要因かもしれません。
これをさらに詳しく調べるために、PHPから直接単純なexigrep呼び出しを実行しました(bashスクリプトは含まれていません)。
<?php
$output = shell_exec('exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
これはうまくいきません。
しかし、私のアカウントのexigrepコピーが呼び出された場合、それはうまくいきます。
<?php
$output = shell_exec('/home/account/public_html/cgi-bin/exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
すべてのPerlスクリプトがこのように失敗した場合は、必要なすべてのスクリプトをローカルアカウントディレクトリにコピーする必要があるため、これをよりよく理解するのが役立ちます。もちろん、exigrepスクリプトが一般的な「ホームディレクトリ」で実行されるのを妨げるすべてを変更するのは良い考えです。
これは非常に強力な解決策ではありませんが、結果を得て調査を実行するための解決策です。