一、查看启动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);
?>