折腾PHP的shell_exec函数的时候,发现一些关于权限的问题。其中就涉及到了sudo命令以及visudo命令。
sudo命令是普通用户执行一些需要root权限时候提升权限的。
比如执行ifconfig需要root权限,如果用普通的www用户是执行不了的,那么就需要在ifconfig前面加上sudo这个命令,输入root密码验证通过之后就可以成功执行。
像这样:
sudo ifconfig
visudo命令是用来编辑/etc/sudoers文件,给用户或用户组授予root权限。
打开/etc/sudoers文件之后,主要注意以下几项配置:
## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) #includedir /etc/sudoers.d www ALL=(ALL) NOPASSWD: ALL
第一项是允许用户以root权限执行所有命令;
第二项是允许用户组中的用户执行任何命令;
第三项是执行root权限命令的时候不需要密码验证;
第四项是从/etc/sudoers.d读取配置文件。
最开始的时候是把www的用户添加到第一项第二项和第三项配置里面,www的用户和用户组属于宝塔面板运行web环境的用户,将www用户和用户组添加进前面的一二三项之后,www就可以执行sudo命令,并且不需要密码验证,再将php的shell_exec代码中增加sudo命令,改成下面这样:
<?php $lanip=shell_exec("sudo ifconfig eth0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{ print $2}' | awk 'NR==1' 2>&1"); ?>
后来研究了一下神雕大神的visudo配置,发现只要修改第四项配置就行了。
于是删除了前面三项的配置,把www用户添加到最后一项配置里面,也就是这一段:
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) #includedir /etc/sudoers.d www ALL=(ALL) NOPASSWD: ALL
然后,神奇的事情就发生了,不用增加sudo命令,用原来的代码也可以成功执行,获得ip地址:
<?php $lanip=shell_exec("ifconfig eth0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{ print $2}' | awk 'NR==1' 2>&1"); ?>
这样的代码也可以直接成功执行,正常获取ip地址。