news 2026/7/22 1:02:39

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

作者头像

张小明

前端开发工程师

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

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


🎯 背景说明

在搭建分布式系统(如 Hadoop、Kubernetes、Redis Cluster)时,我们经常需要让各节点通过主机名互相通信。而 Linux 系统默认只识别localhost,若想通过自定义名称(如node1master)访问本机或其它机器,就必须修改/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/24192.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_NAMEsed转义(本文为简化省略)。


✅ 验证效果

运行后,检查/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/7/15 4:44:46

nodejs基于农产品网上商城农商信息交流平台小程序

目录项目背景技术架构核心功能创新点应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作项目背景 农产品网上商城与农商信息交流平台小程序结合了电子商务与农业信息共享需求,旨在解决传统…

作者头像 李华
网站建设 2026/7/21 20:32:50

【含文档+PPT+源码】基于大数据的交通流量预测系统

项目介绍 本课程演示的是一款基于大数据的交通流量预测系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项目附带的源码…

作者头像 李华
网站建设 2026/7/20 17:34:40

Linux_10:编码

1.视频为什么要编码?在我们做音视频产品的时候,经常会把音视频数据进行网络传输,而此时音视频数据就需要进行 编码(所谓编码就是指压缩)。因为在网络传输的时候,网络带宽有限,若此时网络传输的时候还用 原始数据进行传…

作者头像 李华
网站建设 2026/7/20 21:18:12

ChatGLM-6B在企业客服中的应用:智能问答落地案例

ChatGLM-6B在企业客服中的应用:智能问答落地案例 1. 为什么企业客服需要一个“会思考”的助手? 你有没有遇到过这样的场景:客户在深夜发来一条“订单号123456的物流怎么还没更新?”,客服人员刚下班,系统只…

作者头像 李华
网站建设 2026/7/20 20:09:17

Jupyter调用Qwen3-0.6B全步骤,含base_url设置细节

Jupyter调用Qwen3-0.6B全步骤,含base_url设置细节 1. 为什么在Jupyter里调用Qwen3-0.6B值得你花5分钟读完 你刚启动了Qwen3-0.6B镜像,Jupyter Lab界面已经打开,但卡在“怎么连上模型”这一步?复制文档里的代码却报错ConnectionR…

作者头像 李华
网站建设 2026/7/22 0:10:13

SenseVoice Small多语言实战教程:日语播客转文字+时间戳提取

SenseVoice Small多语言实战教程:日语播客转文字时间戳提取 1. 为什么选SenseVoice Small做日语语音转写? 你有没有试过听一档日语播客,想把精彩内容整理成笔记,却卡在“听不清、记不全、翻得慢”这三座大山?或者手头…

作者头像 李华