背景

  • 说下需求,自己搭建的一个接口开放平台,包含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
 1、 通过 ll (两个小写的L)  查看项目目录的用户组和用户

 2、通过  ps -ef | grep httpd  查看apache或者nginx的用户组和用户,确保他们一致,

 3、如果不一致,将项目目录修改为apache或Nginx的用户组和用户,我这里是www
chown -R www /www
chgrp -R www /www
  • 下面来看看我们的脚本文件 update_hosts.sh,
  • 此时我们的脚本在 /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" #密码 (如mysql>5.6会提示密码安全问题,可以正常执行脚本,可以在my.cnf文件中的 [client] 下面加入password = YourPassword,然后注释本行即可,意思为将密码写到配置文件中,不在shell中明文) DBNAME="jl_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 -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" | awk 'NR>1'` #执行sql(如将密码写入my.cnf中,删除 -p${PASSWORD} 即可,因为默认使用了密码。如此方法行不通,直接 result=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -proot ${DBNAME} -e "${select_sql}" | awk 'NR>1'`)
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文件,发现成功。

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

shell查询MySQL并将结果写入文件中的更多相关文章

  1. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

  2. python将一个字符串写入文件中的编码问题

    python2将一个字符串写入文件中: 1.如果字符串是str类型 # -*- coding:utf-8 -*- txtFile="今天天气不错" name = "1.t ...

  3. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...

  4. python编码的原理以及写入文件中乱码的原因

    1.unicode可以理解为世界上所有字符的集合,它不对应二进制编码 2.详见: https://blog.csdn.net/qq_33692803/article/details/81321340 ...

  5. MySQL添加CSV文件中的数据

    一.MySQL添加csv数据 此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),通过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA ...

  6. C语言中链表任意位置怎么插入数据?然后写入文件中?

    链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 插入某个学号后面图: 定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 ...

  7. linux shell 脚本获取和替换文件中特定内容

    1.从一串字符串中获取特定的信息 要求1:获取本机IP:menu.lst为系统镜象的IP配置文件,需要从中获取到本机IP信息(从文件获取信息) timeout title live find --se ...

  8. 九九乘法表python3写入文件中

    写入文件代码如下: with open("e:\\test01.txt","w+",encoding="utf-8") as wq: for ...

  9. mysql 导入 csv文件中数据,只能导入第一行

    用workbench导入csv数据,只能导入数据的第一行,也就是标注每一列的列名的那一行.但问题是,每次导入完成时,系统提示已经导入了500条记录(这个文件中的确有500条记录),可是刷新数据库后打开 ...

随机推荐

  1. 禁用composer update命令

    composer update 命令会直接把依赖的包更新到最新,会导致整个项目代码都是没有经过测试的不稳定代码 所以一定要禁止使用该命令. 正确的做法是: 更新指定的包到指定的版本(高版本的包也可以更 ...

  2. CentOS7.5下,MySQL安装配置指南

    [root@host---- home]# grep 'temporary password' /var/log/mysqld.log --20T02::.457613Z [Note] A tempo ...

  3. 如何简单的编译v8动态库

    按照google v8的官方提供的方法,在国内,完成编译简直太难了. 还好nodejs提供离线编译能力,稍微改造一下可以从node源码中直接编译纯净的v8动态库. 直接把v8解压出来的py/gpy文件 ...

  4. 酷Q插件_SDK———入门与使用

    1.这里使用的是易语言的SDK,所以请看不惯的人自行离开.{wymbf.} 1.2 这里不会直接给你工程,请用动手打代码,动脑思考. 1.3 不知道.不了解酷Q是干嘛的,请访问:https://cqp ...

  5. 【机器学习】数据处理中白化Whitening的作用图解分析

    之前在看斯坦福教程中whiteining这一章时,由于原始图像相邻像素值具有高度相关性,所以图像数据信息冗余,对于白化的作用的描述主要有两个方面:1,减少特征之间的相关性:2,特征具有相同的方差(协方 ...

  6. elasticsearch 常用查询 + 删除索引 + 集群状态诊断

    1.多条件查询 curl -X POST \ http://10.0.0.42:9200/addressbook_user/_search \ -H 'cache-control: no-cache' ...

  7. python数值列表

    使用range函数生成数值列表 使用range函数打印1~5的数字 for i in range(1,6): print(i) 输出 1 2 3 4 5 利用range函数生成数值列表 >> ...

  8. 17.Azkaban实战

    首先创建一个command.job文件 #command.job type=command command=echo it18zhang 然后打成zip压缩包 上传刚刚打包的zip包 上传完后可以执行 ...

  9. linux 静态库 ar命令用法

    当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量.这里介绍命令ar,用来对库操作. 1.ar基本用法 ar ...

  10. 创建Sqoop作业,报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject

    WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P in ...