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,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文件,發現成功。

  • 這里我就不演示了,大家可以自行嘗試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM