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

环境说明

手头有一台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为成功,其他值为失败或需要输入信息等。

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 100,241评论 9 468
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 14,405评论 2 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,267评论 19 139
  • 一、文件/文件夹管理 ls 列出当前目录文件(不包括隐含文件)ls -a 列出当前目录文件(包括隐含文件)l...
    路痴千行阅读 7,301评论 0 5
  • 架构师必须知道的26项PHP安全实践 PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供...
    meng_philip123阅读 11,305评论 1 161

友情链接更多精彩内容