背景
- 說下需求,自己搭建的一個接口開放平台,包含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
-
如果有對linux用戶組和用戶不清楚的,可以參考 https://www.cnblogs.com/diligenceday/p/10344901.html (方法一)
-
下面說下方法二
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文件,發現成功。
-
這里我就不演示了,大家可以自行嘗試。