PHP Webページから呼び出すと、exigrepコマンドを含むbashスクリプトに問題があります。

PHP Webページから呼び出すと、exigrepコマンドを含むbashスクリプトに問題があります。

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スクリプトが一般的な「ホームディレクトリ」で実行されるのを妨げるすべてを変更するのは良い考えです。

これは非常に強力な解決策ではありませんが、結果を得て調査を実行するための解決策です。

おすすめ記事