shell查询MySQL并将结果写入文件中

背景

  • 说下需求,自己搭建的一个接口开放平台,包含API文档和功能测试,部分内网地址需要修改hosts文件

准备

  • 新建表
    1192213-20190617111024098-1655978250.jpg

  • 然后查看服务器中hosts文件 命令:cat /etc/hosts
    1192213-20190617111113145-1854688517.jpg

  • 我们要做的就是把这张表和这个文件结合起来,通过web页面进行增删改查管理

  • 我在我自己的apidoc项目中添加了一个hosts管理模块用户管理,这里的管理仅仅是数据库上的增删改查,下面,我将增加一个按钮,把数据库中hosts域名一键更新到服务器上的 /etc/hosts 文件中
    1192213-20190617200727749-613813908.jpg

  • 这里我是用的是PHP的 Yii2框架,点击按钮访问这个控制器,然后通过PHP执行脚本,

1192213-20190617201135664-1466214168.jpg

  • 需要注意的是,注意目录和文件所属的用户和用户组,我使用的是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文件,发现成功。

  • 这里我就不演示了,大家可以自行尝试。

转载于:https://www.cnblogs.com/lz0925/p/11042093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值