最新消息: 新版网站上线了!!!

php中exec执行部分linux命令返回空数组

php中可以通过类似exec()系列函数执行Linux中的命令,但是测试时发现,有的命令无法执行。

可能原因是用户权限

1、实例:

通过exec函数查看Linux服务器80端口占用情况,可是返回值为空,exec()函数和Linux的"lsof -i:80"命令都没问题。那很有可能就是执行此php脚本的用户权限问题。

<?php

exec("lsof -i:80",$out,$status);

结果:

var_dump($out);

array(0) { }

echo $status;值为127

2、通过:shell_exec("id -a");查看一下用户以及用户组

<?php

echo shell_exec("id -a");

结果:uid=1002(www) gid=1002(www) groups=1002(www)

1536893548(1).png

3、登录Linux给www用户赋予root级别的权限试一试看

修改/etc/sudoers文件

root ALL=(ALL) ALL

下面增加一行

www ALL=(ALL) ALL

修改后执行php,结果没意义,返回的数组依然为空array(0) { }

4、修改权限没有效果,网上查询说exec第三个参数返回127可能还与路径有关系,那么从路径方面着手试一试

exec("whereis lsof", $out);

var_dump($out);

结果:

array(1) {  [0]=>  string(50) "lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz" }

lsof命令所在文件路径: /usr/sbin/lsof

所以把  exec("lsof -i:80",$out1,$status);修改为exec("/usr/sbin/lsof -i:80",$out1,$status);

var_dump($out1);

结果成功执行了

返回结果如下:

array(6) { 

[0]=>  string(56) "COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME" 

[1]=>  string(67) "nginx   31706  www    6u  IPv4 165987      0t0  TCP *:http (LISTEN)"  

[2]=>  string(67) "nginx   31707  www    6u  IPv4 165987      0t0  TCP *:http (LISTEN)"  

[3]=>  string(113) "nginx   31707  www   12u  IPv4 232481      0t0  TCP localhost.localdomain:http->192.168.204.1:55893 (ESTABLISHED)"  

[4]=>  string(67) "nginx   31708  www    6u  IPv4 165987      0t0  TCP *:http (LISTEN)"  

[5]=>  string(67) "nginx   31709  www    6u  IPv4 165987      0t0  TCP *:http (LISTEN)"

 }

转载请注明:谷谷点程序 » php中exec执行部分linux命令返回空数组