我们有一台运行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脚本调用。
我已经创建了一个shell脚本,它放在/ usr / local / bin / php中以执行解压缩功能。 所以基本上,它需要2个参数(存档文件和文件目的地)。
Shell脚本具有以下权限:-rwxr-xr-x 所以它可以由apache用户运行。
我无法理解它为什么不运行。
Shell脚本:
#!/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;
答案 0 :(得分:0)
检查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”,它运行正常!