【发布时间】:2011-10-22 10:59:40
【问题描述】:
我有一个运行 ubuntu 10.10 maverick 的 linux 服务器,安装了 apache 和 php,在 /var/www 目录中我有一个下载目录。我使用了 OSFile 管理器并修改为包含一个拆分文件的功能,这里是代码:
function spl($fname){
global $folder;
if (!$fname == ""){
maintop("Split");
$dirfile = $folder.$fname;
\\escape directory path
$dirfile = str_replace(" ","\ ",$dirfile);
$dirfile = str_replace("(","\(",$dirfile);
$dirfile = str_replace(")","\)",$dirfile);
$command = "split -d -b1024m ".$dirfile." ".$fname."_";
echo "Command: ".$command;
echo"<br />";
$returnval =0;
unset($output2);
$output = exec($command,$output2,$returnval);
//echo results
echo($output);
echo"<br />";
print_r($output2);
echo"<br />";
echo($returnval);
echo"<br />";
mainbottom();
}
else
home();
}
命令不执行。文件和目录是正确的,但它返回退出代码 1,并且 Array() 作为输出值,我创建了一个包含几个用户的组,我让这个组成为 downloads/ 的所有者,并赋予它读写和执行权限,该组包括 www-data。
我们将不胜感激任何帮助
【问题讨论】:
-
提示 1:使用
addcslashes或escapeshellarg。提示 2:如果您没有捕获任何错误消息,请查看error.log。 -
error.log 位于何处?我试过 escapeshellarg 但它没有对文件路径做任何事情。
-
这是一个网络服务器文件。通常在 docroot 之上。如果需要,Escapeshellarg 在周围添加单引号和反斜杠。
-
我读到它应该转义一个将作为 shell 命令传递的字符串,但它没有转义空格或 (),我检查了 /var/log/apache2/error.log但它是空的
-
如果用单引号括起来,则不需要进一步转义,确实如此。如果你没有得到任何日志条目,或者找不到它们,那么将你的 exec 语句包装在
exec("sh -c \" $cmd 2>&1\"");