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 中的 shell 脚本来执行解压缩功能。所以基本上,它需要 2 个参数(存档文件和文件目标)。

  • 当我用简单的用户在命令行中调用它时,它工作正常。
  • 当我用 PHP 脚本调用它时,它没有运行(错误代码 127)

Shell 脚本具有以下权限:-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 已经调用了 shell 命令。我的命令以 sh 开头。因此,php 执行以下命令:

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

/usr/local/bin/php/ 中不存在 sh 文件

为了纠正这个问题,我刚刚从 exec 命令中删除了“sh”,它工作正常!

于 2012-06-26T14:25:01.697 回答