天天看點

shell查詢MySQL并将結果寫入檔案中

背景

  • 說下需求,搭建一個接口開放平台,包含API文檔和功能測試,部分内網位址需要修改hosts檔案

準備

  • 建立表
shell查詢MySQL并将結果寫入檔案中
  • 然後檢視伺服器中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檔案,發現成功。
  • 這裡就不示範了,大家可以自行嘗試。