shell_exec无法使用.sh脚本

时间:2013-12-11 16:14:51

标签: php shell permissions

我在Ubuntu的apache服务器上托管了一个php文件。除shell_exec('myscript.sh')之外,一切正常。

如果我执行shell_exec('dir')shell_exec('ls')等任何内容,它可以正常运行。但是,只有当我通过shell_exec执行简单的shell脚本时,它才起作用。

为简单起见,我在shell脚本中只放了一个echo命令。我通过终端执行时,相同的脚本工作。像:

# sh myscript.sh // works perfectly fine

但不是来自PHP,下面是我的PHP代码

<?php     
$result = shell_exec('myscript.sh');    
echo $result;     
?>

注意:

  • 安全模式已关闭
  • shell_exec不在disable_functions列表中
  • php和.sh文件都在同一个文件夹中

由于

5 个答案:

答案 0 :(得分:2)

尝试授予PHP文件的所有权。

chown phpusername:phpusername myscript.sh 或者对于apache用户也一样。

如果这不起作用,请尝试chmod 777 myscript.sh,但这通常是一个非常糟糕的主意。

答案 1 :(得分:0)

我认为应该是

$result = shell_exec('./myscript.sh');  

答案 2 :(得分:0)

这是因为你需要以bash参数的形式转义命令。为此,您需要在命令中使用双引号,最后使用2&gt;&amp; 1作为结束部分以及所需的脚本函数命令。

   $xarg = escapeshellarg("./myscript.sh 2>&1");
   $result = shell_exec("$xarg");

并牢记在心,php和bash之间的互动是独一无二的。 PHP总是挂断等待bash。即使该脚本被触发,你的php也应该继续在脚本中转到下一行,而不必在调用函数后等待bash。

答案 3 :(得分:0)

好的,我得到了解决方案。问题是php文件和.sh文件应该在同一组用户中,而php和.sh文件访问的所有其他文件也应该在同一组中

所以,

addgroup myGroupName toOtherGroupName

感谢您的帮助

答案 4 :(得分:0)

我只是用

$res = passthru($cmd);   

一切正常。 这是我的代码,你可能会得到不同的结果。

function flv_convert($in,$out_vid)
{$cmd ='/usr/bin/avconv -i '.$in.' -c:v libx264 -preset ultrafast -b:v 230k -bufsize 64k -s 640x360 -an '.$out_vid.'  2>&1 1> /dev/null';
$res = passthru($cmd);       }
$in = $_POST['url'];
$out_vid = reset(explode('.',$in)).'O.mp4' ;
if (  flv_convert($in, $out_vid)  )
echo 'done ';else echo '  <p>Fail</p>   '