shell查询MySQL并将结果写⼊⽂件中
背景
说下需求,⾃⼰搭建的⼀个接⼝开放平台,包含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,f 删除我们刚才说的⼏个函数,或者将 = 号后⾯清空(不建议)
保存,重启php-fpm和apache或者Nginx
如果有对linux⽤户组和⽤户不清楚的,可以参考(⽅法⼀)
下⾯说下⽅法⼆
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会提⽰密码安全问题,可以正常执⾏脚本,可以在myf⽂件中的 [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 "${s
elect_sql}" | awk 'NR>1'` #执⾏sql(如将密码写⼊myf中,删除 -p${PASSWORD} 即可,因为默认使⽤了密码。如此⽅法⾏不通,直接 res arr=$(echo $result|tr -d "\n\t") # 查询到结果去除特殊符号,
sudo cat /dev/null > /etc/hosts # 清空hosts⽂件
for s in ${arr[@]} # 遍历数组,写⼊hosts⽂件,根据是否含有逗号做不同处理
domysql文档手机版
[[ $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⽂件,发现成功。
这⾥我就不演⽰了,⼤家可以⾃⾏尝试。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论