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

摘要:
此方法不起作用。直接result=`mysql-h${HOSTNAME}-P${PORT}-u${USERNAME}-root${DBNAME}-e“${select_sql}”|awk'NR˃1'`)arr=$#查询结果以删除特殊符号,sulocat/dev/null˃/etc/hosts#清除主机文件中的sin${arr[@]}#遍历阵列,写入主机文件,并根据它是否包含逗号[[$s=~“,”]]&echo-e“”˃/etc/h hosts[[$s=~~“,”]]||echo n${s}“”˃˃/etc/hostsdone[root@ACA83229web]#主要内容是从数据库中查询所有主机记录,然后备份主机文件,清除主机文件,并将查询的记录写入主机文件。难点在于SQL查询的结果。遍历可能不像你想象的那样,空格会改变行。但是,有些空间不需要更改线。外壳第一次遍历阵列时,处理起来很耗时。

背景

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

准备

  • 新建表
    shell查询MySQL并将结果写入文件中第1张

  • 然后查看服务器中hosts文件 命令:cat /etc/hosts
    shell查询MySQL并将结果写入文件中第2张

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

  • 我在我自己的apidoc项目中添加了一个hosts管理模块用户管理,这里的管理仅仅是数据库上的增删改查,下面,我将增加一个按钮,把数据库中hosts域名一键更新到服务器上的 /etc/hosts 文件中
    shell查询MySQL并将结果写入文件中第3张

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

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

  • 需要注意的是,注意目录和文件所属的用户和用户组,我使用的是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 "
	")       # 查询到结果去除特殊符号,

sudo cat /dev/null > /etc/hosts      # 清空hosts文件

for s in ${arr[@]}                           # 遍历数组,写入hosts文件,根据是否含有逗号做不同处理
do
    [[ $s =~ "," ]] && echo -e "
" >> /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并将结果写入文件中》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇频率带宽解释SQLALchemy之创建表,删除表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SHELL脚本编程配置环境

SHELL脚本编程配置环境 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.bash如何展开命令行 1>.bash的优先级 把命令行分成单个命令词   展开别名 展开大括号的声明({}) 展开波浪符声明(~) 命令替换$() 和 ``) 再次把命令行分成命令词 展开文件通配(*、?、[abc]等等) 准备I/0重导...

shell脚本监控Linux系统性能指标

2016-11-04 22:41 原作者不详分类: Linux(7)在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出现异常时及时报警,通知系统管理员。本文介绍在Linux系统下几种常见的监控需求及其shell脚本的编写。 文章目录: 1.Linux使用 Shell 检查进程是否存...

win 10 如何找到 mysql 的 my.ini 文件

本文主要讲解如何找到win10 系统的 my.ini 文件 1. 找到服务程序。   桌面图标 计算机  右键 点击管理        找到 mysql 8.0 服务                 第二步:   查看 mysql 8.0 的属性    查看可执行文件的路径    "C:Program FilesMySQLMySQL Server 8.0...

C语言操作mysql

php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysqlnd , libmysqlclient 对比:http://php.net/manual/en/mysqlinfo.library.choosing.ph...

Navicat for MySQL下载、安装与破解

一:下载Navicat for MySQL   进入 Navicat for MySQL下载 ,根据需要选择下载的版本,我选择的是Windows 64bit,任意选择一个镜像地址下载。          二:安装Navicat for MySQL   运行 → 下一步 → 点击“我同意” → 选择安装路径 → 保留默认,下一步 → 选择是否创建桌面图标,建...

Dapper基本用法--MySql

NuGet: Dapper 2.0.35 MySql.Data System.Data 实体(Entity) 1 public class student 2 { 3 public int Id { get; set; } 4 public string RealName { get; set; } 5...