news 2026/9/30 16:41:29

手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名

适用场景:集群部署、Kubernetes 节点配置、多机通信环境
系统要求:Linux(Ubuntu/CentOS 等主流发行版)
前置知识:基础 Shell 命令、了解/etc/hosts文件作用


🎯 背景说明

在搭建分布式系统(如 Hadoop、Kubernetes、Redis Cluster)时,我们经常需要让各节点通过主机名互相通信。而 Linux 系统默认只识别localhost,若想通过自定义名称(如node1、master)访问本机或其它机器,就必须修改/etc/hosts文件。

但每次手动查 IP、编辑 hosts 文件既繁琐又容易出错。本文将带你编写一个交互式 Bash 脚本,自动完成以下任务:

  1. 列出所有可用网卡;
  2. 用户选择要使用的网卡;
  3. 自动获取该网卡的 IPv4 地址;
  4. 输入节点名称(如node1);
  5. 自动更新/etc/hosts,确保IP → 主机名映射正确。

💡 脚本功能预览

运行脚本后,你会看到类似如下交互:

>>>检测可用网卡... 可用网卡列表:0)eth01)wlan0 请选择要使用的网卡编号:0>>>选中网卡 eth0 的 IP:192.168.1.105 请输入当前节点名称(例如 node1): node1>>>将192.168.1.105 node1 添加到 /etc/hosts... ✅ /etc/hosts 更新完成!当前记录:192.168.1.105 node1

如果node1已存在,则自动覆盖旧 IP,避免重复条目。


📜 完整脚本代码

将以下内容保存为setup-hosts.sh:

#!/bin/bash# 手动选择网卡并更新 /etc/hostsset-e# 遇到错误立即退出# 获取所有非回环网卡(排除 lo)echo">>> 检测可用网卡..."NETWORK_INTERFACES=($(ip-olinkshow|awk-F': ''{print $2}'|grep-v lo))# 若无可用网卡,报错退出if[${#NETWORK_INTERFACES[@]}-eq0];thenecho"❌ 未检测到可用网卡!"exit1fi# 列出网卡供用户选择echo"可用网卡列表:"foriin"${!NETWORK_INTERFACES[@]}";doecho"$i)${NETWORK_INTERFACES[$i]}"done# 读取用户输入的编号read-p"请选择要使用的网卡编号: "NIC_INDEX# 校验输入是否合法if![["$NIC_INDEX"=~^[0-9]+$]]||["$NIC_INDEX"-ge${#NETWORK_INTERFACES[@]}];thenecho"❌ 输入编号无效!"exit1fiSELECTED_NIC=${NETWORK_INTERFACES[$NIC_INDEX]}# 获取选中网卡的 IPv4 地址(取第一个 inet 地址)IP_ADDR=$(ip-4 addr show"$SELECTED_NIC"|grepinet|awk'{print $2}'|cut-d/ -f1|head-n1)if[-z"$IP_ADDR"];thenecho"❌ 选中网卡$SELECTED_NIC没有 IPv4 地址!"exit1fiecho">>> 选中网卡$SELECTED_NIC的 IP:$IP_ADDR"# 输入节点名称read-p"请输入当前节点名称(例如 node1): "NODE_NAMEif[-z"$NODE_NAME"];thenecho"❌ 节点名称不能为空!"exit1fi# 更新 /etc/hostsifgrep-q"$NODE_NAME"/etc/hosts;thenecho">>> /etc/hosts 已存在$NODE_NAME,自动更新 IP..."# 使用 sed 替换整行(匹配以任意字符开头、包含 NODE_NAME 的行)sed-i"s/.*$NODE_NAME/$IP_ADDR$NODE_NAME/"/etc/hostselseecho">>> 将$IP_ADDR$NODE_NAME添加到 /etc/hosts..."echo"$IP_ADDR$NODE_NAME">>/etc/hostsfiecho"✅ /etc/hosts 更新完成!当前记录:"grep"$NODE_NAME"/etc/hosts

🔍 逐行详解

1.set -e

  • 作用:脚本中任何命令返回非 0(失败),立即退出。
  • 避免错误累积导致不可预期行为。

2. 获取网卡列表

ip-olinkshow|awk-F': ''{print $2}'|grep-v lo
  • ip -o link show:以单行格式列出所有网络接口。
  • awk -F': ' '{print $2}':以:为分隔符,提取接口名(如eth0)。
  • grep -v lo:排除回环接口lo(127.0.0.1 无实际通信意义)。

3. 用户交互选择

  • 使用数组索引让用户选择网卡,避免拼写错误。
  • 严格校验输入是否为数字且在有效范围内。

4. 获取 IPv4 地址

ip-4 addr show"$SELECTED_NIC"|grepinet|awk'{print $2}'|cut-d/ -f1|head-n1
  • ip -4:只显示 IPv4。
  • grep inet:过滤出带 IP 的行。
  • cut -d/ -f1:去掉子网掩码(如192.168.1.105/24→192.168.1.105)。
  • head -n 1:只取第一个 IP(适用于多 IP 场景)。

5. 更新/etc/hosts

  • 存在则更新:用sed替换整行,防止旧 IP 残留。
    sed-i"s/.*$NODE_NAME/$IP_ADDR$NODE_NAME/"/etc/hosts

    注意:此正则会匹配任意以$NODE_NAME结尾的行,并替换为新 IP + 名称。

  • 不存在则追加:直接echo >>。

⚠️ 注意事项

  1. 权限问题:
    修改/etc/hosts需要 root 权限!
    运行时请使用:

    sudobashsetup-hosts.sh
  2. 主机名唯一性:
    本脚本假设每个节点名称全局唯一。若多台机器使用相同NODE_NAME,会导致解析冲突!

  3. 多 IP 网卡:
    脚本只取第一个 IPv4 地址。如有特殊需求(如指定公网 IP),可进一步扩展逻辑。

  4. 安全性:
    sed替换时未转义特殊字符(如-、.)。若NODE_NAME含正则元字符,可能出错。
    进阶建议:对$NODE_NAME做sed转义(本文为简化省略)。


✅ 验证效果

运行后,检查/etc/hosts:

cat/etc/hosts|grepnode1# 应输出:192.168.1.105 node1

测试解析:

pingnode1# 应能正常 ping 通本机 IP

🧩 扩展建议

  • 支持批量配置多个节点(读取 YAML/JSON 配置文件);
  • 自动同步到集群其它节点(结合scp或 Ansible);
  • 增加 DNS 兼容模式(优先使用 DNS,fallback 到 hosts)。

📌 总结

这个小脚本虽短,却融合了:

  • 网络信息获取(ip命令)
  • 用户交互(read)
  • 文本处理(grep/sed/awk)
  • 系统配置管理(/etc/hosts)

非常适合 DevOps 工程师、集群运维人员日常使用。一键配置,告别手敲 IP!

💡提示:将此脚本加入你的自动化部署工具箱,效率翻倍!

原创不易,转载请注明出处!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 3:29:29

nodejs基于node.js和vue的游戏点单陪玩系统

目录 基于Node.js和Vue的游戏点单陪玩系统摘要系统架构设计核心功能模块技术亮点扩展性与维护应用场景 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 基于Node.js和Vue的游戏点单陪玩系统摘要 系统架构…

作者头像 李华
网站建设 2026/9/30 14:15:13

会计要素是会计这座“信息大厦”的基石性构件

这是一个非常好的问题!会计的核算过程之所以需要那些“要素”(资产、负债、所有者权益、收入、费用、利润),不是随意的规定,而是因为它们构成了一个**逻辑严密、相互勾稽的完整框架**。这个框架是会计工作的基石&#…

作者头像 李华
网站建设 2026/9/29 8:54:02

Unity 3D入门制作无人机射击游戏

Unity 3D for Beginners: Build a Drone Shooter GameUnity 3D入门:制作无人机射击游戏 (入门级Unity 3D实战课,纯英文授课,14节课/3小时21分钟,从0搭建可游玩的3D无人机射击游戏,掌握Unity基础与C#核心开发…

作者头像 李华
网站建设 2026/9/29 8:54:02

Z-Image-Turbo支持中文提示词,描述更自然

Z-Image-Turbo支持中文提示词,描述更自然 Z-Image-Turbo不是又一个“能跑就行”的图像生成模型,而是真正把中文表达逻辑吃透的AI绘画工具。它不强迫你翻译成英文、不依赖生硬的关键词堆砌、不让你反复试错调整语法结构——你用日常说话的方式写提示词&a…

作者头像 李华