获取root权限 php执行shell

张映 发表于 2016-08-15

分类目录: php

标签:, ,

有的时候,通过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,在这里要注意一点,路径问题,相对路径和绝对路径,尽量用绝对路径。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/1819.html/comment-page-1

1 条评论

  1. PHP程序员雷雪松 留言

    PHP调用shell是一个不错的技巧。