[实践OK]PHP以root权限运行某些命令,涉及Linux命令 chmod  例:chmod u+s,树莓派Raspberry Pi也能使用,只是要加一个sudo 在前面,否则Mplayer不能播放,关机也不行。

jackxiang 2014-1-26 13:43 | |
背景:PHP以WWW权限运行,想通过它执行svn相关命令,出现问题,可以用PHP调用C实现SVN更新的由www到root的参考实践来自:http://u-czh.iteye.com/blog/1565744
一、C代码实现SVN命令的传递,特别是实现权限的更换:
resetServerAndOptSVN.c

二、PHP代码如下:
resetServerAndOptSVN.php

三、shell执行make成二进制文件并root更换的授权:
gcc -o resetServerAndOptSVN  -Wall resetServerAndOptSVN.c                                                                                                    
chmod u+s  resetServerAndOptSVN #需要手工在shell下执行
chmod -R 777 resetServerAndOptSVN



“为了方便普通用户执行一些特权命令,
SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。”

chmod u+s 就是给某个程序的所有者以suid权限,可以像root用户一样操作。

变更文件或目录的权限。
在UNIX系统家族里,文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。您可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果您对符号连接修改权限,其改变会作用在被连接的原始文件。权限范围的表示法如下:
  u:User,即文件或目录的拥有者。
  g:Group,即文件或目录的所属群组。
  o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。
  a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
  有关权限代号的部分,列表于下:
  r:读取权限,数字代号为"4"。
  w:写入权限,数字代号为"2"。
  x:执行或切换权限,数字代号为"1"。
  -:不具任何权限,数字代号为"0"。
  s:特殊?b>功能说明:变更文件或目录的权限。

语法  
       chmod [-cfRv][--help][--version][<权限范围>+/-/=<权限设置...>][文件或目录...]
  chmod [-cfRv][--help][--version][数字代号][文件或目录...]
  chmod [-cfRv][--help][--reference=<参考文件或目录>][--version][文件或目录...] 选项说明  -c或--changes 效果类似"-v"参数,但仅回报更改的部分。
  -f或--quiet或--silent 不显示错误信息。
  -R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
  -v或--verbose 显示指令执行过程。
  --help 在线帮助。
  --reference=<参考文件或目录> 把指定文件或目录的权限全部设成和参考文件或目录的权限相同
  --version 显示版本信息。
  <权限范围>+<权限设置> 开启权限范围的文件或目录的该项权限设置。
  <权限范围>-<权限设置> 关闭权限范围的文件或目录的该项权限设置。
  <权限范围>=<权限设置> 指定权限范围的文件或目录的该项权限设置。

摘自:http://blog.sina.com.cn/s/blog_a04184c101010kpk.html




PHP通过ROOT权限执行linux命令 :AddTime:2015-08-18
问题

通过php重启apache可以把apache的控制放到web页面上。
但是由于php本身的运行模式,一般而言,除非apache具备root权限,否则php连/etc都访问不了,更不用说反过来控制apache了。
因此,我们需要找到别的方法。
思路

通过system,exec等方法,PHP可以呼出一些权限之内的命令,或者执行一些可执行的程序。
因此我们可以事先编译一个重启apache的可执行程序,并赋予其root权限,然后让php调用该程序来实现apache的重启动。
————————————————————————————————————————————————————————————————————


gcc rebootTempSys.c -o rebootTempSys -g
chmod u+s rebootTempSys


一些关键点的解说

1:
重启Apache的系统命令很多,比起代码中的调用,更有名的应该是/etc/init.d/httpd restart,但是很遗憾,在本应用中这个系统命令是不能调用的,如果使用这个命令,那么Apache会在中止掉自己进程的瞬间,终止这个程序的继续运行,也就无法对自身进行重启动,因此我们需要通过发送信号给Apache,在不中止进程的情况下重启Apache,这一点非常重要。
关于apachectl -k restart的详细信息,可以参照下面的网址
http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/stopping.html

2: 双重fork。 如果只是重启apache,而不在乎程序本身的动作,那么我们可以直接在代码中执行system(“apachectl -k restart”)而不必产生新的进程。
但是,考虑一下整个流程,如果我们这样做了,那么当我们访问PHP页面的时候,PHP(Apache)调用文件,瞬间重启自身,那么很自然,结果就是页面崩溃。
当然,Apache依然可以重启成功,但是,这一点也不优雅。
因此,使用双重fork可以让我们避免当前页面崩溃而对Apache进行重启动。

3: 更进一步的安全措施:
编译完sample后,计算其MD5值,并把该值固化到PHP中,然后在PHP中加入校验代码,以防止sample被恶意替换。

On raspberry pi:
pi@raspberrypi:/data/htdocs/t.jackxiang.com/cgi-bin$ ./rebootTempSys
pi@raspberrypi:/data/htdocs/t.jackxiang.com/cgi-bin$ reboot: must be superuser.

其实是root了,但为何还不能重启动,经实践得知,得加一个sudo即可:
代码修改添加为:  system("sudo reboot"); //多一个sudo即可。

From:http://blog.csdn.net/qzmrock/article/details/8731889


在树莓派下播放指定的音乐或录音,Test it Ok,能关机能播放声音,实践Ok,代码如下,一定要加个sudo,即使在上面的办法下,且是root下还得加sudo,否则没法实现播放声音和开机或重启,brainpowertempsrv.php:

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6975/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-8-18 16:22
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]