1

PHP 4.3.9を実行し、safe_modeがONでsafe_mode_exec_dirが/ usr / local / bin /php/に設定されているサーバーがあります。

したがって、php.netに記述されているため、safe_mode_exec_dirにないスクリプトを実行することはできません。

/ usr / bin内にあるunzipシステムコマンド(zipライブラリはありません)を呼び出したいです。そのため、PHPスクリプトで呼び出すことはできません。

/ usr / local / bin/phpに配置してunzip関数を実行するシェルスクリプトを作成しました。したがって、基本的には2つの引数(アーカイブファイルとファイルの宛先)を取ります。

  • 単純なユーザーでコマンドラインで呼び出すと、正常に動作します。
  • PHPスクリプトで呼び出すと、実行されません(エラーコード127)

シェルスクリプトは次の権限を持っています:-rwxr-xr-xしたがって、apacheユーザーが実行できます。

なぜ動かないのか理解できません。

シェルスクリプト:

#!/bin/bash
DIR=$1
FILE=$2

# Write to file to check if shell script is running
echo "BANANA" > /my/path/to/app/banana-log.txt

# If file exists, run unzip
if [ -a $FILE ];
    then
        /usr/bin/unzip -u $FILE -d $DIR >> /my/path/to/app/banana-log.txt
else
    echo "FILE_NOT_FOUND $1"  >> /my/path/to/app/banana-log.txt;
fi

PHPスクリプト:

$output = array();
$return_value = -1;

//-- Get safe_mode_exec_dir value
$shell_script = ini_get('safe_mode_exec_dir') . "/myscript.sh";
$shell_cmd = sprintf("sh %s %s %s", $shell_script, escapeshellarg('/my/destination/path'), escapeshellarg('my/path/to/archive/file.zip'));


//-- Execute command
echo "COMMAND IS : ", $shell_cmd;
$output = exec($shell_cmd, $output, $return_value);
echo "RESPONSE IS : ", implode("<br />",$output);
echo "RETURN CODE IS : ",$return_value;
4

1 に答える 1

1

apacheエラーログを確認した後、次のメッセージが表示されました。

sh:/ usr / local / bin / php / sh:そのようなファイルやディレクトリはありません

したがって、明確ではありませんが、execはすでにシェルコマンドを呼び出しています。私のコマンドはshから始まります。したがって、phpは次のコマンドを実行します。

sh sh /usr/local/bin/php/myscript.sh'/my/destination/path''/my/path/to/archive/file.zip'

shファイルは/usr/ local / bin /php/に存在しません

これを修正するために、execコマンドから「sh」を削除しました。正常に動作します。

于 2012-06-26T14:25:01.697 に答える