在网络管理领域,时常需要对网络配置进行变更,比如修改IP地址、子网掩码、网关,调整DNS服务器等。传统手动操作不仅耗时费力,还容易出错,尤其是在大规模网络环境中。而借助Shell脚本,我们能够实现网络配置变更的自动化,极大提升工作效率与准确性。本文将详细介绍如何利用Shell脚本来达成常见的网络配置自动化变更。
一、基本原理与前期准备
Shell脚本实现网络配置变更,本质是通过脚本调用系统命令,修改网络配置文件,并适时重启网络服务,使新配置生效。不同Linux发行版的网络配置文件与命令略有差异,例如:
• CentOS 6及之前版本:主要网络配置文件是/etc/sysconfig/network-scripts/ifcfg-ethX(X代表网卡编号),重启网络服务命令为service network restart。
• CentOS 7及之后版本:配置文件路径类似,但管理工具更多使用nmcli,重启网络服务命令是systemctl restart network 。
• Ubuntu:网络配置文件通常在/etc/network/interfaces,可使用ifup和ifdown命令管理网络接口,或用systemctl restart networking重启网络服务。
在编写脚本前,务必明确目标系统类型,确保脚本兼容性。同时,要提前规划好网络配置变更的具体内容,如新增IP地址、修改网关等。
二、修改IP地址与子网掩码
以CentOS 7系统为例,假设要将网卡eth0的IP地址从192.168.1.100修改为192.168.1.101,子网掩码从255.255.255.0改为255.255.0.0,脚本如下:
#!/bin/bash
# 备份原网络配置文件
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# 修改IP地址和子网掩码
sed -i 's/IPADDR=192.168.1.100/IPADDR=192.168.1.101/g' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's/NETMASK=255.255.255.0/NETMASK=255.255.0.0/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# 重启网络服务使配置生效
systemctl restart network
# 检查新配置是否生效
ifconfig eth0 | grep "inet "
脚本解释:
1. 使用cp命令备份原网络配置文件,防止修改出错无法恢复。
2. 利用sed命令,通过正则表达式搜索并替换原IP地址和子网掩码。
3. 执行systemctl restart network重启网络服务,应用新配置。
4. 最后使用ifconfig命令查看网卡配置,确认新IP地址和子网掩码已生效。
三、更改网关与DNS服务器
继续以CentOS 7为例,若要将网关从192.168.1.1改为192.168.0.1,同时将DNS服务器从默认改为8.8.8.8和8.8.4.4,脚本如下:
#!/bin/bash
# 备份原网络配置文件
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# 修改网关
sed -i 's/GATEWAY=192.168.1.1/GATEWAY=192.168.0.1/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# 修改DNS服务器
sed -i 's/^DNS1=.*/DNS1=8.8.8.8/' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's/^DNS2=.*/DNS2=8.8.4.4/' /etc/sysconfig/network-scripts/ifcfg-eth0
# 如果原文件没有DNS2相关行,添加DNS2配置
grep -q "DNS2" /etc/sysconfig/network-scripts/ifcfg-eth0 || echo "DNS2=8.8.4.4" >> /etc/sysconfig/network-scripts/ifcfg-eth0
# 重启网络服务使配置生效
systemctl restart network
# 检查新网关和DNS配置是否生效
route -n | grep "UG"
nmcli dev show eth0 | grep "IP4.DNS"
脚本解释:
1. 同样先备份原配置文件。
2. 用sed命令分别修改网关和DNS服务器配置。
3. 针对DNS服务器配置,不仅修改已有行,还处理了可能不存在第二DNS服务器配置行的情况,若不存在则追加。
4. 重启网络服务后,使用route -n查看路由表确认网关变更,用nmcli dev show查看网卡详细信息确认DNS服务器变更。
四、多网卡与复杂网络配置变更
当服务器存在多个网卡,且网络配置较为复杂时,编写脚本需更细致。例如,要为多网卡分别配置不同IP地址、子网掩码、网关和DNS,可参考以下脚本框架:
#!/bin/bash
# 定义网卡配置数组
declare -A nic_configs=(
["eth0"]="192.168.1.100/24,192.168.1.1,8.8.8.8,8.8.4.4"
["eth1"]="192.168.2.100/24,192.168.2.1,114.114.114.114,114.114.115.115"
)
for nic in "${!nic_configs[@]}"; do
config=${nic_configs[$nic]}
ip_subnet=$(echo $config | cut -d',' -f1)
gateway=$(echo $config | cut -d',' -f2)
dns1=$(echo $config | cut -d',' -f3)
dns2=$(echo $config | cut -d',' -f4)
# 备份原网络配置文件
cp /etc/sysconfig/network-scripts/ifcfg-$nic /etc/sysconfig/network-scripts/ifcfg-$nic.bak
# 修改IP地址、子网掩码、网关和DNS配置
sed -i "s/IPADDR.*$/IPADDR=${ip_subnet%\/*}/" /etc/sysconfig/network-scripts/ifcfg-$nic
sed -i "s/NETMASK.*$/NETMASK=${ip_subnet#*\/}/" /etc/sysconfig/network-scripts/ifcfg-$nic
sed -i "s/GATEWAY.*$/GATEWAY=$gateway/" /etc/sysconfig/network-scripts/ifcfg-$nic
sed -i "s/^DNS1=.*/DNS1=$dns1/" /etc/sysconfig/network-scripts/ifcfg-$nic
sed -i "s/^DNS2=.*/DNS2=$dns2/" /etc/sysconfig/network-scripts/ifcfg-$nic
grep -q "DNS2" /etc/sysconfig/network-scripts/ifcfg-$nic || echo "DNS2=$dns2" >> /etc/sysconfig/network-scripts/ifcfg-$nic
done
# 重启网络服务使配置生效
systemctl restart network
# 逐个检查各网卡配置是否生效
for nic in "${!nic_configs[@]}"; do
ifconfig $nic | grep "inet "
route -n | grep "UG" | grep $nic
nmcli dev show $nic | grep "IP4.DNS"
done
此脚本利用关联数组nic_configs存储各网卡配置信息,通过循环对每个网卡进行配置修改、备份、重启网络服务以及生效检查操作,适用于复杂多网卡网络环境下的配置变更。
通过上述方法,利用Shell脚本实现自动化网络配置变更,可显著提升网络管理工作的效率与稳定性,减少人为错误,尤其适用于大规模网络部署与日常运维场景 。在实际应用中,可根据具体网络架构和需求,灵活调整和扩展脚本功能。