美文网首页网络运维管理
LINUX+NGINX下的PHP exec函数执行linux命令

LINUX+NGINX下的PHP exec函数执行linux命令

作者: 那个懒懒的懒 | 来源:发表于2017-12-27 14:31 被阅读0次

    环境说明

    手头有一台linux的测试服务器,最近因为业务需要,需要通过php访问另一台服务器去执行某些命令。

    由于另一台服务器已经对这台服务器开了私钥,所以在终端上是可以直接执行命令而不需要输入密码的。

    问题

    PHP无法使用exec命令,没有任何返回值。

    解决途径

    1.php.ini的配置有问题。

      由于php是7.0以上的版本,取消了安全模式,所以考虑PHP.ini文件配置。
    

    打开php配置文件,里面有一行disabel_function的值,此处记录了禁止运行的函数,在里面讲exec和shell_exec,system等函数删除。

    2.权限问题

    修改以后PHP可以运行部分命令了,但是部分外部程序和命令仍然不能运行。使用sudo返回失败。

    于是运行“whoami”查看,环境下php-frm的运行角色是www。

    于是修改sudoers文件。
    vi /etc/sudoers

    将www添加到
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    下面:
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    www ALL=(ALL) NOPASSWD:ALL

    然后找到Default requiretty这一行,把他注释掉
    # Default requiretty

    ps:意思就是sudo默认需要tty终端,注释掉就可以在后台执行了.

    重启nginx和php-fpm
    service nginx restart
    service php-fpm restart

    这样,PHP就可以在需要执行外部命令的时候使用sudo利用root身份执行命令,而不会报错或者执行失败了!

    ps:exec()返回值说明

    $result = exec("sudo ssh root@192.168.1.64 systemctl restart smb.service;",$output,$ret_val);

    $result ->返回执行结果的最后一行
    $output ->返回命令执行结果,数组形式,可以用print_r来输出。
    $ret_val ->返回执行成功与否的代码--=0为成功,其他值为失败或需要输入信息等。

    当然、最好不要在生产线上环境使用哦!可以在内网机器上面实现!

    本文仅作为自己备忘记录、如果有出入、莫见怪哈!!!!

    相关文章

      网友评论

        本文标题:LINUX+NGINX下的PHP exec函数执行linux命令

        本文链接:https://www.haomeiwen.com/subject/jrrugxtx.html