问题描述:
目前公司项目现场使用的Centos7服务器越来越多,有的时候更改ip地址很麻烦,nmcli和nmtui命令对linux的新手来说很麻烦,所以写一个简单的shell脚本,让新人可以独立的更改网卡信息
解决方案:
首先我写的这个脚本的逻辑是通过echo向Centos7的网卡配置文件进行替换,将原来网卡的参数进行覆写,然后重启网卡让配置文件生效,这样就完成了更改网卡IP、子网掩码、网关、DNS等参数的配置
步骤:
(1)创建一个sh结尾的文件
(2)使用vim命令对ip.sh进行编辑
(3)指定解释器
(4)首先我们先确定我们修改的哪些参数是可以不用改变的,哪些参数是我们需要修改的,哪些参数是必须和每个不同现场的服务器的参数一致的
TYPE=Ethernet
#网卡类型:以太网
PROXY_METHOD=none
#代理的方式:关闭
BROWSER_ONLY=no
#只是浏览器:否
BOOTPROTO=dhcp
#网卡的引导:dhcp
DEFROUTE=yes
#默认的路由:是
IPV4_FAILURE_FATAL=no
#开启IPV4致命错误检测:否
IPV6INIT=yes
#IPV6自动初始化: 是
IPV6_AUTOCONF=yes
#IPV6自动配置:是
IPV6_DEFROUTE=yes
#IPV6可以为默认路由:是
IPV6_FAILURE_FATAL=no
#开启IPV6致命错误检测:否
IPV6_ADDR_GEN_MODE=stable-privacy
#IPV6地址生成模型:stable-privacy
NAME=enp3s0
#网卡的物理设备名称
UUID=1daf82da-91fd-4c1a-9422-e36988082611
#通用的识别码,每一个网卡都会有不能重复,如果重复两台linux只能有其中一个服务器可以使用该网卡
DEVICE=enp3s0
#网卡的设备名称, 必须和 NAME 值一样
ONBOOT=no
#是否开机自启,网卡开机启动或通过systemctl restart network来进行控制网卡需要设置为 yes
IPADDR=192.168.99.251
#网卡的IP地址
NETMASK=255.255.255.0
#网卡的子网掩码
GATEWAY=192.168.99.1
#网卡的网关地址
DNS1=8.8.8.8
#网卡的DNS地址
(5)根据上面参数解释我们可以列出来下面几个参数为手动进行修改
IPADDR=192.168.99.251
NETMASK=255.255.255.0
GATEWAY=192.168.99.1
DNS1=8.8.8.8
(6)由于每个网卡的UUID是独立不能重复的所以我们需要根据每一个现场不同的UUID进行填写
UUID=1daf82da-91fd-4c1a-9422-e36988082611
(7)我们将UUID作为一个固定的变量来写入到我们的shell脚本中我们可以使用nmcli con来查看每一张网卡的UUID的值
(8)获取到UUID的值我们需要过滤一下,只需要UUID的值
(9)命令成功之后我们写入到脚本内
(10)判断nmcli命令是否正常,如果正常向下一步运行,防止命令出错导致脚本没有监测继续运行
(11)将用户需要改的IP地址等参数作为变量来进行传输,放到if判断里面
(12)变量设置完成了,我们使用echo向CentOS7的网卡配置文件进行覆写,将变量作为参数传到echo内如下图,在进行echo前为了以防万一我们先将CentOS7的源网卡配置文件进行复制备份,防止覆写的时候出错导致服务器出现网卡的问题,比较麻烦
(13)设置完成后我们需要的是重启网卡,因为更改了网卡,会导致当前的ssh退出,所以我们在重启网卡前先询问用户是否在当前环境进行重启网卡,所以我下面写了一个简单的判断,如果回答的是yes那么就重启网卡,如果回答的是no那么就不重启网卡,让用户手动重启。
(14) 脚本写完之后保存退出,然后我们运行就可以进行修改网卡的ip地址了
shell脚本代码(建议自己书写比较好):
#!/bin/bash
nmcli con | sed -n '2,2p' | awk '{print $2}'
if [ $? -eq 0 ];then
uuid=$(nmcli con | sed -n '2p' | awk '{print $2}')
read -p 'NAME:' net
read -p 'IP:' ip
read -p 'NETMASK:' mask
read -p 'GATEWAY:' gateway
read -p 'DNS1:' dns
read -p 'BOOTPROTO(dhcp/none):' proto
read -p 'ONBOOT(no/yes):' onboot
cp /etc/sysconfig/network-scripts/ifcfg-$net /etc/sysconfig/network-scripts/bak_ifcfg-$net
echo "TYPE=Ethernet
BOOTPROTO=$proto
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=$net
UUID=$uuid
DEVICE=$net
ONBOOT=$onboot
IPADDR=$ip
NETMASK=$mask
GATEWAY=$gateway
DNS1=$dns" > /etc/sysconfig/network-scripts/ifcfg-$net
read -p 'Restart the network? (yes/no)' a
if [ $a == 'yes' ];then
systemctl restart network
exit
elif [ $a == 'no' ];then
echo 'exit>>>>>restart network take effect<<<<<'
else
echo 'ERROR'
exit
fi
else
echo 'Please install nmcli(yum -y install NetworkManager)'
exit
fi