使用Bash脚本自动配置Linux的/etc/hosts文件

 更新时间:2026年01月27日 08:56:31   作者:weixin_46244623  
本文介绍了如何编写一个交互式Bash脚本,自动完成为多机通信环境配置/etc/hosts文件的任务,脚本会列出所有可用网卡,用户选择要使用的网卡,并自动获取该网卡的IPv4地址,需要的朋友可以参考下

适用场景:集群部署、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) eth0
1) 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/hosts
set -e  # 遇到错误立即退出

# 获取所有非回环网卡(排除 lo)
echo ">>> 检测可用网卡..."
NETWORK_INTERFACES=($(ip -o link show | awk -F': ' '{print $2}' | grep -v lo))

# 若无可用网卡,报错退出
if [ ${#NETWORK_INTERFACES[@]} -eq 0 ]; then
  echo "❌ 未检测到可用网卡!"
  exit 1
fi

# 列出网卡供用户选择
echo "可用网卡列表:"
for i in "${!NETWORK_INTERFACES[@]}"; do
  echo "$i) ${NETWORK_INTERFACES[$i]}"
done

# 读取用户输入的编号
read -p "请选择要使用的网卡编号: " NIC_INDEX

# 校验输入是否合法
if ! [[ "$NIC_INDEX" =~ ^[0-9]+$ ]] || [ "$NIC_INDEX" -ge ${#NETWORK_INTERFACES[@]} ]; then
  echo "❌ 输入编号无效!"
  exit 1
fi

SELECTED_NIC=${NETWORK_INTERFACES[$NIC_INDEX]}

# 获取选中网卡的 IPv4 地址(取第一个 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 "❌ 选中网卡 $SELECTED_NIC 没有 IPv4 地址!"
  exit 1
fi

echo ">>> 选中网卡 $SELECTED_NIC 的 IP: $IP_ADDR"

# 输入节点名称
read -p "请输入当前节点名称(例如 node1): " NODE_NAME
if [ -z "$NODE_NAME" ]; then
  echo "❌ 节点名称不能为空!"
  exit 1
fi

# 更新 /etc/hosts
if grep -q "$NODE_NAME" /etc/hosts; then
  echo ">>> /etc/hosts 已存在 $NODE_NAME,自动更新 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 更新完成!当前记录:"
grep "$NODE_NAME" /etc/hosts

逐行详解

1.set -e

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

2. 获取网卡列表

ip -o link show | 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" | grep inet | awk '{print $2}' | cut -d/ -f1 | head -n 1
  • 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 >>

注意事项

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

sudo bash setup-hosts.sh

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

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

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

验证效果

运行后,检查 /etc/hosts

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

测试解析:

ping node1
# 应能正常 ping 通本机 IP

扩展建议

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

总结

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

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

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

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

以上就是使用Bash脚本自动配置Linux的/etc/hosts文件的详细内容,更多关于Bash脚本配置Linux的/etc/hosts文件的资料请关注脚本之家其它相关文章!

相关文章

  • shell脚本源码安装nginx的详细过程

    shell脚本源码安装nginx的详细过程

    这篇文章主要介绍了shell脚本源码安装nginx,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • rhel5.7下安装gearmand及启动的方法

    rhel5.7下安装gearmand及启动的方法

    这篇文章主要介绍了rhel5.7下安装gearmand及启动的方法,需要的朋友可以参考下
    2014-07-07
  • shell脚本实现文件锁功能

    shell脚本实现文件锁功能

    这篇文章主要介绍了shell脚本实现文件锁功能,本文实现了一个排它锁,从而实现避免脚本重复执行,需要的朋友可以参考下
    2014-12-12
  • shell处理用户输入传递参数的实现

    shell处理用户输入传递参数的实现

    本文主要介绍了shell处理用户输入传递参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • linux查看磁盘空间的命令详解

    linux查看磁盘空间的命令详解

    本篇文章主要给大家介绍了linux查看磁盘空间的两个命令,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定大帮助,需要的朋友可以参考下
    2023-12-12
  • 判断文件是否存在的shell脚本代码

    判断文件是否存在的shell脚本代码

    判断文件是否存在的shell脚本,有详细的注释,很不错,有需要的朋友不妨参考下
    2013-02-02
  • 详解&&、()、||决定linux命令的执行顺序

    详解&&、()、||决定linux命令的执行顺序

    这篇文章主要介绍了&&、()、||决定linux命令的执行顺序,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • Shell脚本对文件中的行、单词、字符进行迭代输出示例

    Shell脚本对文件中的行、单词、字符进行迭代输出示例

    这篇文章主要介绍了Shell脚本对文件中的行、单词、字符进行迭代输出示例,本文讲解了迭代文件中的每一行、迭代一行中的每一个单词、迭代一个单词中的每一个字符等内容,需要的朋友可以参考下
    2014-11-11
  • Linux命令定位与查找之which、whereis和find的用法示例详解

    Linux命令定位与查找之which、whereis和find的用法示例详解

    Linux命令的定位与查找是我们日常工作中必备的技能,掌握which、whereis和find这三个命令,可以帮助我们更加高效地进行文件搜索和定位工作,这篇文章主要介绍了Linux命令定位与查找:which、whereis和find的用法详解,需要的朋友可以参考下
    2023-10-10
  • Linux常用高频命令

    Linux常用高频命令

    这篇文章介绍了Linux常用的高频命令,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论