php以root权限来执行exec()或者shell_exec()

一、查看启动php的进程的用户是谁
可以通过在命令中执行:

ps -ef | grep php

或者在php中执行echo exec('whoami')

    $cmd = 'whoami';
    exec($cmd,$outcome);
    var_dump($outcome);

centos下默认会是nobody,nobody默认没有任何权限
此时先添加一个用户和组

/usr/sbin/groupadd xxxx
/usr/sbin/useradd -g xxxx -s /bin/bash xxxx

加完后 vim etc/passwd中可以看到新添加的用户

vim /etc/passwd

二、修改php启动用户为刚您添加的用户
找到php安装的地方php-fpm.d下的www.conf

find / -name php.fpm.d

打开配置文件www.conf,编辑

user = xxx;
group = xxxx;(xxx为您刚添加的用户)

重启php-fpm

systemctl restart php-fpm

重复上面查看php启动进程的用户、应该已经变了
三、添加刚才的用户xxx到sudoers中

vim /etc/sudoers
root  ALL=(ALL)   ALL
xxx  ALL=(ALL)  ALL  //新添加这一行
%xxx  ALL=(ALL)    NOPASWD:  ALL    //设置xxx组下面的用户使用sudo不需要输入密码  

注意:如果sudoers文件中Defaulsts requiretty未注释,需要注释了


微信截图_20200413173013.png

这是因为默认情况下,执行sudo需要一个终端,注释掉就行了

四、到这里已经可以正常在exec中使用sudo your command来执行命令了

<?php
$cmd = '/usr/bin/unoconv -f pdf test.pptx';
exec($cmd);
?>

五、注意:
1.sudo的时候出现错误:

sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

解决办法
1.切换到root用户

su root

将 /etc/sudoers文件的权限设置为440

chmod 440 /etc/sudoers

在测试下

<?php
$cmd = 'sudo /usr/bin/unoconv -f pdf test.pptx';
exec($cmd);
?>

参考:https://www.cnblogs.com/miaoshiqian/p/4482666.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容