使用Bash腳本自動(dòng)配置Linux的/etc/hosts文件
適用場(chǎng)景:集群部署、Kubernetes 節(jié)點(diǎn)配置、多機(jī)通信環(huán)境
系統(tǒng)要求:Linux(Ubuntu/CentOS 等主流發(fā)行版)
前置知識(shí):基礎(chǔ) Shell 命令、了解 /etc/hosts 文件作用
背景說明
在搭建分布式系統(tǒng)(如 Hadoop、Kubernetes、Redis Cluster)時(shí),我們經(jīng)常需要讓各節(jié)點(diǎn)通過主機(jī)名互相通信。而 Linux 系統(tǒng)默認(rèn)只識(shí)別 localhost,若想通過自定義名稱(如 node1、master)訪問本機(jī)或其它機(jī)器,就必須修改 /etc/hosts 文件。
但每次手動(dòng)查 IP、編輯 hosts 文件既繁瑣又容易出錯(cuò)。本文將帶你編寫一個(gè)交互式 Bash 腳本,自動(dòng)完成以下任務(wù):
- 列出所有可用網(wǎng)卡;
- 用戶選擇要使用的網(wǎng)卡;
- 自動(dòng)獲取該網(wǎng)卡的 IPv4 地址;
- 輸入節(jié)點(diǎn)名稱(如
node1); - 自動(dòng)更新
/etc/hosts,確保IP → 主機(jī)名映射正確。
腳本功能預(yù)覽
運(yùn)行腳本后,你會(huì)看到類似如下交互:
>>> 檢測(cè)可用網(wǎng)卡... 可用網(wǎng)卡列表: 0) eth0 1) wlan0 請(qǐng)選擇要使用的網(wǎng)卡編號(hào): 0 >>> 選中網(wǎng)卡 eth0 的 IP: 192.168.1.105 請(qǐng)輸入當(dāng)前節(jié)點(diǎn)名稱(例如 node1): node1 >>> 將 192.168.1.105 node1 添加到 /etc/hosts... ? /etc/hosts 更新完成!當(dāng)前記錄: 192.168.1.105 node1
如果 node1 已存在,則自動(dòng)覆蓋舊 IP,避免重復(fù)條目。
完整腳本代碼
將以下內(nèi)容保存為 setup-hosts.sh:
#!/bin/bash
# 手動(dòng)選擇網(wǎng)卡并更新 /etc/hosts
set -e # 遇到錯(cuò)誤立即退出
# 獲取所有非回環(huán)網(wǎng)卡(排除 lo)
echo ">>> 檢測(cè)可用網(wǎng)卡..."
NETWORK_INTERFACES=($(ip -o link show | awk -F': ' '{print $2}' | grep -v lo))
# 若無可用網(wǎng)卡,報(bào)錯(cuò)退出
if [ ${#NETWORK_INTERFACES[@]} -eq 0 ]; then
echo "? 未檢測(cè)到可用網(wǎng)卡!"
exit 1
fi
# 列出網(wǎng)卡供用戶選擇
echo "可用網(wǎng)卡列表:"
for i in "${!NETWORK_INTERFACES[@]}"; do
echo "$i) ${NETWORK_INTERFACES[$i]}"
done
# 讀取用戶輸入的編號(hào)
read -p "請(qǐng)選擇要使用的網(wǎng)卡編號(hào): " NIC_INDEX
# 校驗(yàn)輸入是否合法
if ! [[ "$NIC_INDEX" =~ ^[0-9]+$ ]] || [ "$NIC_INDEX" -ge ${#NETWORK_INTERFACES[@]} ]; then
echo "? 輸入編號(hào)無效!"
exit 1
fi
SELECTED_NIC=${NETWORK_INTERFACES[$NIC_INDEX]}
# 獲取選中網(wǎng)卡的 IPv4 地址(取第一個(gè) inet 地址)
IP_ADDR=$(ip -4 addr show "$SELECTED_NIC" | grep inet | awk '{print $2}' | cut -d/ -f1 | head -n 1)
if [ -z "$IP_ADDR" ]; then
echo "? 選中網(wǎng)卡 $SELECTED_NIC 沒有 IPv4 地址!"
exit 1
fi
echo ">>> 選中網(wǎng)卡 $SELECTED_NIC 的 IP: $IP_ADDR"
# 輸入節(jié)點(diǎn)名稱
read -p "請(qǐng)輸入當(dāng)前節(jié)點(diǎn)名稱(例如 node1): " NODE_NAME
if [ -z "$NODE_NAME" ]; then
echo "? 節(jié)點(diǎn)名稱不能為空!"
exit 1
fi
# 更新 /etc/hosts
if grep -q "$NODE_NAME" /etc/hosts; then
echo ">>> /etc/hosts 已存在 $NODE_NAME,自動(dòng)更新 IP..."
# 使用 sed 替換整行(匹配以任意字符開頭、包含 NODE_NAME 的行)
sed -i "s/.*$NODE_NAME/$IP_ADDR $NODE_NAME/" /etc/hosts
else
echo ">>> 將 $IP_ADDR $NODE_NAME 添加到 /etc/hosts..."
echo "$IP_ADDR $NODE_NAME" >> /etc/hosts
fi
echo "? /etc/hosts 更新完成!當(dāng)前記錄:"
grep "$NODE_NAME" /etc/hosts
逐行詳解
1.set -e
- 作用:腳本中任何命令返回非 0(失?。?,立即退出。
- 避免錯(cuò)誤累積導(dǎo)致不可預(yù)期行為。
2. 獲取網(wǎng)卡列表
ip -o link show | awk -F': ' '{print $2}' | grep -v lo
ip -o link show:以單行格式列出所有網(wǎng)絡(luò)接口。awk -F': ' '{print $2}':以:為分隔符,提取接口名(如eth0)。grep -v lo:排除回環(huán)接口lo(127.0.0.1 無實(shí)際通信意義)。
3. 用戶交互選擇
- 使用數(shù)組索引讓用戶選擇網(wǎng)卡,避免拼寫錯(cuò)誤。
- 嚴(yán)格校驗(yàn)輸入是否為數(shù)字且在有效范圍內(nèi)。
4. 獲取 IPv4 地址
ip -4 addr show "$SELECTED_NIC" | grep inet | awk '{print $2}' | cut -d/ -f1 | head -n 1
ip -4:只顯示 IPv4。grep inet:過濾出帶 IP 的行。cut -d/ -f1:去掉子網(wǎng)掩碼(如192.168.1.105/24→192.168.1.105)。head -n 1:只取第一個(gè) IP(適用于多 IP 場(chǎng)景)。
5. 更新/etc/hosts
存在則更新:用 sed 替換整行,防止舊 IP 殘留。
sed -i "s/.*$NODE_NAME/$IP_ADDR $NODE_NAME/" /etc/hosts
注意:此正則會(huì)匹配任意以 $NODE_NAME 結(jié)尾的行,并替換為新 IP + 名稱。
- 不存在則追加:直接
echo >>。
注意事項(xiàng)
權(quán)限問題:
修改 /etc/hosts 需要 root 權(quán)限!
運(yùn)行時(shí)請(qǐng)使用:
sudo bash setup-hosts.sh
主機(jī)名唯一性:
本腳本假設(shè)每個(gè)節(jié)點(diǎn)名稱全局唯一。若多臺(tái)機(jī)器使用相同 NODE_NAME,會(huì)導(dǎo)致解析沖突!
多 IP 網(wǎng)卡:
腳本只取第一個(gè) IPv4 地址。如有特殊需求(如指定公網(wǎng) IP),可進(jìn)一步擴(kuò)展邏輯。
安全性:sed 替換時(shí)未轉(zhuǎn)義特殊字符(如 -、.)。若 NODE_NAME 含正則元字符,可能出錯(cuò)。
進(jìn)階建議:對(duì) $NODE_NAME 做 sed 轉(zhuǎn)義(本文為簡(jiǎn)化省略)。
驗(yàn)證效果
運(yùn)行后,檢查 /etc/hosts:
cat /etc/hosts | grep node1 # 應(yīng)輸出:192.168.1.105 node1
測(cè)試解析:
ping node1 # 應(yīng)能正常 ping 通本機(jī) IP
擴(kuò)展建議
- 支持批量配置多個(gè)節(jié)點(diǎn)(讀取 YAML/JSON 配置文件);
- 自動(dòng)同步到集群其它節(jié)點(diǎn)(結(jié)合
scp或 Ansible); - 增加 DNS 兼容模式(優(yōu)先使用 DNS,fallback 到 hosts)。
總結(jié)
這個(gè)小腳本雖短,卻融合了:
- 網(wǎng)絡(luò)信息獲?。?code>ip 命令)
- 用戶交互(
read) - 文本處理(
grep/sed/awk) - 系統(tǒng)配置管理(
/etc/hosts)
非常適合 DevOps 工程師、集群運(yùn)維人員日常使用。一鍵配置,告別手敲 IP!
提示:將此腳本加入你的自動(dòng)化部署工具箱,效率翻倍!
以上就是使用Bash腳本自動(dòng)配置Linux的/etc/hosts文件的詳細(xì)內(nèi)容,更多關(guān)于Bash腳本配置Linux的/etc/hosts文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
linux echo命令以及l(fā)inux echo命令提示權(quán)限不夠的解決辦法
linux的echo命令, 在shell編程中極為常用, 在終端下打印變量value的時(shí)候也是常常用到的, 因此有必要了解下echo的用法。下面通過本文給大家介紹linux echo命令以及l(fā)inux echo命令提示權(quán)限不夠的解決辦法,感興趣的朋友一起看看吧2017-09-09
Shell腳本實(shí)現(xiàn)亂序排列文件內(nèi)容的多種方法(洗牌問題)
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)亂序排列文件內(nèi)容的多種方法(洗牌問題),本文給出3個(gè)Shell腳本和一個(gè)Python腳本解決亂序排列文件內(nèi)容問題,需要的朋友可以參考下2015-01-01
在 SHELL 腳本中調(diào)用另一個(gè) SHELL 腳本的方法(報(bào)錯(cuò): go
在Linux平臺(tái)上開發(fā),經(jīng)常會(huì)在console(控制臺(tái))上執(zhí)行另外一個(gè)腳本文件,經(jīng)常用的方法有:./my.sh 或 source my.sh 或 . my.sh;這三種方法有什么不同呢?這篇文章主要介紹了在 SHELL 腳本中調(diào)用另一個(gè) SHELL 腳本的方法(報(bào)錯(cuò): go:not found),需要的朋友可以參考下2023-08-08
CentOS 6.x系統(tǒng)升級(jí)Python到2.7版本的Shell腳本分享
這篇文章主要介紹了CentOS 6.x系統(tǒng)升級(jí)Python到2.7版本的Shell腳本分享,本文把升級(jí)過程總結(jié)成一個(gè)自動(dòng)腳本,需要的朋友可以參考下2014-11-11

