CentOS中PHP用shell_exec函数执行命令的权限

admin2022-12-29  468

神雕大神的NAS主页有一段PHP代码是用来获取服务器IP地址的,目的就是为了服务器IP地址改变的时候,不用去修改html文件,自动识别IP地址。当然,是内网的。

代码是这样写的:

<?php
$lanip=shell_exec("ifconfig eth0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{ print $2}' | awk 'NR==1' 2>&1");
?>

 

这段代码的意思是lanip通过=号后面的命令进行获取。然后在需要填IP地址的地方用下面的代码调用就行了:

<?php echo $lanip ?>

 

之前我把神雕大神的NAS主页直接复制到我的CentOS中,但是无法成功获得IP地址。经过一番冥思苦想发现有几个问题。

 

第一个问题就是,代码中的eth0代表网卡,而我的网卡名称并不是eth0,而是enp2s0这样的名称。

 

第二个问题就是,ifconfig这个命令需要root权限才能执行,而宝塔面板安装的nginx和php执行权限是www,并没有root权限。

 

把代码中的eth0修改成enp2s0还是很简单,至于修改www的执行权限就需要修改系统配置。

 

度娘一番,查到了相关的资料。

 

使用下面的命令修改用户和用户组执行命令的权限:

visudo #修改/etc/sudoers的内容

 

通过visudo可以修改配置文件,找到配置文件中下面的内容:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

 

在后面把www用户添加进去,变成这样:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
www    ALL=(ALL)       ALL

 

再找到下面的内容:

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

 

修改成这样:

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
%www  ALL=(ALL)       ALL

 

这是修改用户组的权限。

 

再找到下面的内容:

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

 

这一段的意思是执行sudo权限命令时不需要输入密码。把这一段修改成这样:

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
%www        ALL=(ALL)       NOPASSWD: ALL

 

保存退出,重启一下nginx和php-fpm服务。还是无法成功获取IP,于是在代码中加上sudo,最终变成下面的样子:

<?php
$lanip=shell_exec("sudo ifconfig enp2s0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{ print $2}' | awk 'NR==1' 2>&1");
?>

 

终于成功的获取到IP地址了。

转载请注明原文地址:http://www.198484.com/?read-32.html
000

最新回复(0)