背景
- 说下需求,自己搭建的一个接口开放平台,包含API文档和功能测试,部分内网地址需要修改hosts文件
准备
新建表
然后查看服务器中hosts文件 命令:cat /etc/hosts
我们要做的就是把这张表和这个文件结合起来,通过web页面进行增删改查管理
我在我自己的apidoc项目中添加了一个hosts管理模块用户管理,这里的管理仅仅是数据库上的增删改查,下面,我将增加一个按钮,把数据库中hosts域名一键更新到服务器上的 /etc/hosts 文件中
这里我是用的是PHP的 Yii2框架,点击按钮访问这个控制器,然后通过PHP执行脚本,
需要注意的是,注意目录和文件所属的用户和用户组,我使用的是Apache(Nginx也一样)作为web服务器,Apeche的用户组为www,
脚本放在了项目的index.php同级目录中,所属用户和用户组也是www,总之,尽量把这些相关的用户组都设置为统一的,以免权限不够,无法执行脚本,后面会说如何修改用户组
- PS:记得在php.ini 配置文件中,打开shell_exec, 或者exec,system等PHP调用系统函数, 默认是禁止的。
找到你的php.ini文件,一般在 /usr/local/php/etc/php.ini,打开
查找到 disable_functions ,删除需要使用的函数名,如下:
disable_functions = phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
删除我们刚才说的几个函数,或者将 = 号后面清空(不建议)
保存,重启php-fpm和apache或者Nginx
如果有对linux用户组和用户不清楚的,可以参考 https://www.cnblogs.com/diligenceday/p/10344901.html (方法一)
- 下面说下方法二
1、 通过 ll 查看项目目录的用户组和用户
2、通过 ps -ef | grep httpd 查看apache或者nginx的用户组和用户,确保他们一致,
3、如果不一致,将项目目录修改为apache或Nginx的用户组和用户,我这里是www
chown -R www /www
chgrp -R www /www
此时我们的脚本在 /www/apidoc/web目录下,即与apidoc的index.php同级
- 下面来看看我们的脚本文件 update_hosts.sh,
[root@ACA83229 web]# cat update_hosts.sh
#!/bin/bash
HOSTNAME="127.0.0.1" #数据库主机IP
PORT="3306" #端口号
USERNAME="root" #用户名
PASSWORD="root" #密码
DBNAME="xm_api_document" #数据库名称
TABLENAME="hosts" #数据库中表的名称
sudo cp /etc/hosts /etc/hosts_bak #备份hosts文件
select_sql="select CONCAT_WS(' ',ip,domain,',') as rows from ${TABLENAME}" #sql语句,已逗号分隔每条记录,
result=`mysql ${DBNAME} -e "${select_sql}" | awk 'NR>1'` #执行sql
arr=$(echo $result|tr -d "\n\t") # 查询到结果去除特殊符号,
sudo cat /dev/null > /etc/hosts # 清空hosts文件
for s in ${arr[@]} # 遍历数组,写入hosts文件,根据是否含有逗号做不同处理
do
[[ $s =~ "," ]] && echo -e "\n" >> /etc/hosts
[[ $s =~ "," ]] || echo -n ${s}" " >> /etc/hosts
done
[root@ACA83229 web]#
主要内容是从数据库中查询所有的host记录,然后备份hosts文件,,清空hosts文件,将查询到的记录写入到hosts文件
难点在于sql查询出来的结果,遍历的时候可能不是你想的那样,空格会换行,然而有的空格不需要换行,第一次shell遍历数组,处理起来费脑。
此时,我们要 执行 chmod -R 777 /etc/hosts 给hosts文件操作权限,此时不用修改用户组,因为shell脚本执行时默认是root权限。
现在我们可以新添加一天hostjilu,然后点击 Deploy Hosts按钮,查看/etc/hosts文件,发现成功。
这里我就不演示了,大家可以自行尝试。