我在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列表中由于
答案 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> '