星星博客 »  > 

tp5 使用 exec() 返回127 的解决

骚嘿!又是你,搬砖搬得怎样了;唉,快和国宝有得比了,真烦人!

先写一个测试文件 test.php,放在与入口文件的同目录下

访问:http://你的域名/test.php

<?php
    //exec("ls",$out,$status);
    exec("php -v 2>&1",$out,$status);
    print_r($out);
    echo " - ";
    print_r($status);

1、本地测试没问题;(终端:php -v ,访问:http://域名/test.php)

2、远程终端命令执行也没问题;

3、远程访问(http://你的域名/test.php)返回:Array ( [0] => sh: php: command not found ),测试 ls 命令却可以正常输出

检查:

1、查看配置文件 php.ini ;safe_mode=off,disable_functions 里没有禁用 exec() 和 system() 等函数;

2、文件权限打开,用户权限打开;

3、启动方式:由 Apache 转为 Nginx;

服务器环境:CentOS7,小皮(thinkPHP)面板V1.27,php7.3.8/php7.1.31

最终还是不行,上帝已死,请相信自己,在崩溃中站起才是真正的勇士!

在网上查询: linux下的exec命令;

看到了这句话:shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。 

没办法,小时候上学,语文考试都在及格线上徘徊,这把我吓的,脸差点青白!

最后折腾的,我实在没法子了,那就掀桌子吧!

先把项目备份,数据备份;然后,到服务器上重新安装镜像系统 CentOS7,去宝塔安装个面板:

# Centos安装脚本 
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

1、选择环境:Nginx,php7.3.8,MySQL5.7,phpMyAdmin 4.9

2、在宝塔面板上添加站点,把项目上传到对应的文件夹下,数据文件上传到新建的数据库里,检查用户名和密码是否一致;

3、在面板站点里设置网站目录,伪静态,ssl等等;

4、如果项目的入口文件index.php 是在 /public下的,修改 .user.ini 文件:

open_basedir=/www/wwwroot/happycommon.top/public:/tmp/
# 改为:
open_basedir=/www/wwwroot/happycommon.top/:/tmp/

5、打开配置文件 php.ini ;把 disable_functions 里面禁用 exec 函数去掉;

远程访问(http://你的域名/test.php),最后测试成功!

别问我为什么?因为所以,我也不清楚!

但肯定的是,上帝已死,只能靠自己;想靠打野帮你抓,先想好自己的补刀和对线的人头,猥琐发育,别浪!

 

相关文章