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

作者:

文章目录
  • 在搭建分布式系统(如 Hadoop、Kubernetes、Redis Cluster)时,我们经常需要让各节点通过主机名互相通信。而 Linux 系统默认只识别 localhost,若想通过自定义名称(如 node1、master)访问本机或其它机器,就必须修改 /etc/hosts 文件。 但每次手动查 IP、编辑 hosts 文件既繁琐又容易出错。本文将带你编写一个交互式 Bash 脚本,自动完成以下任务: 列出所有可用网卡; 用户选择要使用的网卡; 自动获取该网卡的 IPv4 地址; 输入节点名称(如 node1); 自动更新 /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
  • 权限问题:修改 /etc/hosts 需要 root 权限!运行时请使用: sudo bash setup-hosts.sh 主机名唯一性:本脚本假设每个节点名称全局唯一。若多台机器使用相同 NODE_NAME,会导致解析冲突! 多 IP 网卡:脚本只取第一个 IPv4 地址。如有特殊需求(如指定公网 IP),可进一步扩展逻辑。 安全性:sed 替换时未转义特殊字符(如 -、.)。若 NODE_NAME 含正则元字符,可能出错。进阶建议:对 $NODE_NAME 做 sed 转义(本文为简化省略)。
  • 运行后,检查 /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文件的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Linux Bash脚本自动创建keystore和生成公钥方式 Bash脚本启动多个Chrome浏览器窗口并自动清理的实现过程 使用Bash脚本自动化清理Nacos日志文件的实现方法 Bash脚本实现实时监测登录 使用Bash脚本和Logrotate实现Nginx日志切割的方法
  • 目录
    • 背景说明
    • 脚本功能预览
    • 完整脚本代码
    • 逐行详解
      • 1.set -e
      • 2. 获取网卡列表
      • 3. 用户交互选择
      • 4. 获取 IPv4 地址
      • 5. 更新/etc/hosts
    • 注意事项
      • 验证效果
        • 扩展建议
          • 总结

            适用场景:集群部署、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
            

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

            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 无实际通信意义)。

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

            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 场景)。

            存在则更新:用 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文件的资料请关注风君子博客其它相关文章!

            您可能感兴趣的文章:

            • Linux Bash脚本自动创建keystore和生成公钥方式
            • Bash脚本启动多个Chrome浏览器窗口并自动清理的实现过程
            • 使用Bash脚本自动化清理Nacos日志文件的实现方法
            • Bash脚本实现实时监测登录
            • 使用Bash脚本和Logrotate实现Nginx日志切割的方法

            站内搜索