有的时候,通过php做很多系统操作的时候,并不如直接利用bash来的快。php-fpm默认是apache用户,直接改成root账户,是启动不了的。这样的话,apache用户无法执行root才能执行的命令。所以我们要先使php-fpm的启动用户,拥有执行shell的权限,以及shell内部执行命令的权限。
一,获取root权限
1,给具体进程指定无密码访问
# visudo //添加以下内容,文件最下面有例子,照着写
apache ALL=(ALL) NOPASSWD:/etc/init.d/srs
调用的时候
$result = shell_exec("/usr/bin/sudo /etc/init.d/srs start");
2,批定用户无需密码,切换root账号
# visudo
apache ALL=(ALL) NOPASSWD: ALL
直接可以用sudo su切换成root用户,权限远大于上面的方法,权限越大,安全性越低。
3,针对某个shell脚本,开放权限
如果说第一方法,满足不了要求,第二方法权限过大,不安全,那么第三种方法可以试试
# visudo
apache ALL=(ALL) NOPASSWD: UPLOADVIDEO
Cmnd_Alias UPLOADVIDEO = /var/www/srs/upload.sh
调用方法根一般调用方法一样。
还有一点很重要就是visudo时注释掉,#Default requiretty,因为php调用shell时,用不到终端
二,php调用shell怎么调试
不好调试,无log可查,只能看输出,nginx,php的log没有调用shell的相关信息,我有一些以经验,屡试不爽
1,检查php启动用户权限,文件本身能被执行,php启动用户也要能执行该文件的权限。以前遇到过一个情况是,php执行一个shell怎么都执行不了,后来才发面,没有chmod +x操作。
2,php是可以捕获取shell的输出的,但是要知道,不是所有命令执行都是有输出的,也就是说,成功,失败,或者没执行没办法区别,搞不清。这个时候,我们可以shell脚本中输出,用echo就可以。这样我们可以知道,执行到什么地方,可以知道,在什么地方出错了。
3,直接通过su切换到php的启动用户,然后在linux命令行下执行,有人问了,nologin用户无法su,那就直接useradd一个,改一下php的启动用户。如果用php的启动用户测试成功,通过php脚本去执行,基本也是能通过的。
4,在这里要注意一点,路径问题,相对路径和绝对路径,尽量用绝对路径。