最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Bash腳本自動(dòng)配置Linux的/etc/hosts文件

 更新時(shí)間:2026年01月27日 08:56:31   作者:weixin_46244623  
本文介紹了如何編寫一個(gè)交互式Bash腳本,自動(dòng)完成為多機(jī)通信環(huán)境配置/etc/hosts文件的任務(wù),腳本會(huì)列出所有可用網(wǎng)卡,用戶選擇要使用的網(wǎng)卡,并自動(dòng)獲取該網(wǎng)卡的IPv4地址,需要的朋友可以參考下

適用場(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ù):

  1. 列出所有可用網(wǎng)卡;
  2. 用戶選擇要使用的網(wǎng)卡;
  3. 自動(dòng)獲取該網(wǎng)卡的 IPv4 地址;
  4. 輸入節(jié)點(diǎn)名稱(如 node1);
  5. 自動(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/24192.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_NAMEsed 轉(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)文章

最新評(píng)論

洛浦县| 黄梅县| 宣城市| 石棉县| 襄城县| 勐海县| 扎兰屯市| 怀安县| 堆龙德庆县| 铜梁县| 托里县| 绵阳市| 花莲市| 万年县| 米脂县| 龙里县| 屏南县| 兴安县| 宜丰县| 潜江市| 惠水县| 新晃| 郎溪县| 教育| 方山县| 丽江市| 赤峰市| 桐乡市| 玉树县| 同江市| 丰原市| 石门县| 霍州市| 钦州市| 泾阳县| 澄城县| 福贡县| 龙海市| 濮阳县| 阳新县| 巫山县|