脚本功能
1、实现将动态IP修改为静态IP;
2、实现将静态IP修改为其他静态IP;
3、检查IP是否合法
4、检测IP是否冲突
5、检测网关是否畅通
6、IP、子网掩码、网关输入不合法时,要求循环输入
7、实现修改之前确认是否修改,如果不修改需要恢复原IP信息
8、执行IP修改之后,如发现无法上网,IP回滚,恢复之前状态
脚本内容
#!/bin/bash
#auto alter ip
#auth by toyix
#2020年7月18日 10:19:24
#######################
DATE=`date +%Y%m%d%H%M`
#定义函数 - 选择要修改IP的网卡
INTERFACE_CHOOSE () {
echo -e "\033[32m---------------------------------------------------------\033[0m"
PS3="请按提示,选择要修改的网卡:"
select INTERFACE in `ls /sys/class/net/|grep -v 'lo'`
do
break
done
}
#定义函数 - 输入IP地址,如果IP地址不正确,循环输入,直到正确为止
DEFINE_IPADDR_NEW () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo ""
read -p " 请正确输入IP地址: " NEW_IPADDR
echo ${NEW_IPADDR}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
while [ $? -ne 0 ]
do
read -p " IP定义不正确,请重新输入 : " NEW_IPADDR
echo ${NEW_IPADDR}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{0,3}$' >/dev/null 2>&1
done
}
#定义函数 - 检测IP输入后,是否会IP冲突,如果冲突,则重新调用函数DEFINE_IPADDR_NEW,重新输入IP
CHECK_IP_conflict () {
echo " 检测IP中,请稍等2秒..."
ping -c 2 "${NEW_IPADDR}" |grep "ttl" >/dev/null 2>&1
while [ $? -eq 0 ]
do
echo -e "\033[33m IP冲突,请重新输入\033[0m"
DEFINE_IPADDR_NEW
echo " 检测IP中,请稍等2秒..."
ping -c 2 "${NEW_IPADDR}" |grep "ttl" >/dev/null 2>&1
done
echo -e "\033[32m IP定义成功!! \033[0m"
}
#定义函数 - 输入子网掩码,如果子网掩码不正确,循环输入,直到正确为止
DEFINE_NETMASK_NEW () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo ""
read -p " 请输入子网掩码:" NEW_NETMASK
echo ${NEW_NETMASK}|grep -iwE '^255\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
while [ $? -ne 0 ]
do
read -p " 子网掩码定义不正确,请重新输入 : " NEW_NETMASK
echo ""
echo ${NEW_NETMASK}|grep -iwE '^255\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
done
}
#定义函数 - 输入网关,如果网关不通,循环输入,直到输入后能ping通为止
DEFINE_GATEWAY () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
read -p " 请输入网关: " NEW_GATEWAY
echo " 检测网关中,请稍等2秒..."
ping -c 2 "${NEW_GATEWAY}"|grep -iE "ttl" >/dev/null 2>&1
while [ $? -ne 0 ]
do
read -p " 网关不通,请重新输入正确网关 : " NEW_GATEWAY
echo " 检测网关中,请稍等2秒..."
ping -c 2 "${NEW_GATEWAY}"|grep -iE "ttl" >/dev/null 2>&1
done
echo -e "\033[32m------网关定义成功!------\033[0m"
}
ping -c 2 192.168.1.1|grep -iE "ttl" >/dev/null 2>&1
INTERFACE_CHOOSE
DEFINE_IPADDR_NEW
CHECK_IP_conflict
DEFINE_NETMASK_NEW
DEFINE_GATEWAY
echo $INTERFACE
echo ${NEW_IPADDR}
echo ${NEW_NETMASK}
echo ${NEW_GATEWAY}
INTERFACE_DIR="/etc/sysconfig/network-scripts"
DHCP_OR_STATIC=`cat ${INTERFACE_DIR}/ifcfg-${INTERFACE} |sed '/^BOOTPROTO/p' -n|awk -F"=" '{print $2}'`
echo $DHCP_OR_STATIC
#备份网卡文件
\cp ${INTERFACE_DIR}/ifcfg-${INTERFACE}{,${DATE}.bak}
#备份DNS配置文件
\cp /etc/resolv.conf{,.bak}
if [[ ${DHCP_OR_STATIC} == "dhcp" ]];then
sed -i '/^BOOTPROTO/cBOOTPROTO=static' ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aGATEWAY=${NEW_GATEWAY}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aNETMASK=${NEW_NETMASK}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aIPADDR=${NEW_IPADDR}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[32m 已生成网卡${INTERFACE}配置文件,见下: \033[0m"
echo -e "\033[32m#################################################################\033[0m"
cat ${INTERFACE_DIR}/ifcfg-${INTERFACE}
elif [[ ${DHCP_OR_STATIC} == "static" ]];then
sed -i "/^GATEWAY/cGATEWAY=${NEW_GATEWAY}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^NETMASK/cNETMASK=${NEW_NETMASK}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^IPADDR/cIPADDR=${NEW_IPADDR}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[32m 已生成网卡${INTERFACE}配置文件,见下\033[0m"
echo -e "\033[32m#################################################################\033[0m"
cat ${INTERFACE_DIR}/ifcfg-${INTERFACE}
fi
echo -e "\033[32m#################################################################\033[0m"
echo ""
while true
do
read -p "请检查网卡${INTERFACE}配置文件,确认是否执行修改IP操作,YES or NO : " ALTER_Y_N
case $ALTER_Y_N in
YES|Y|yes|y)
echo -e "\033[32m 网卡${INTERFACE}IP修改成功,网络重启中,请使用新IP链接服务器................the end !\033[0m"
#重启网卡
systemctl restart network.service
#恢复dns配置文件
\cp /etc/resolv.conf.bak /etc/resolv.conf
ifconfig ${INTERFACE}
ping -c 5 www.baidu.com
if [ $? -ne 0 ];then
echo -e "\033[33m -----------------------\033[0m"
echo -e "\033[33m 无法上网,IP回滚!!\033[0m"
echo -e "\033[33m -----------------------\033[0m"
\mv ${INTERFACE_DIR}/ifcfg-${INTERFACE}${DATE}.bak ${INTERFACE_DIR}/ifcfg-${INTERFACE}
systemctl restart network.service
\cp /etc/resolv.conf.bak /etc/resolv.conf
ping -c 2 www.baidu.com
if [ $? -eq 0 ];then
echo -e "\033[32m -----------------------!\033[0m"
echo -e "\033[32m 回滚成功!!\033[0m"
echo -e "\033[32m -----------------------!\033[0m"
ifconfig ${INTERFACE}
else
echo -e "\033[33m 回滚失败,请检查!!\033[0m"
fi
fi
exit 0
;;
NO|no|N|n)
\mv ${INTERFACE_DIR}/ifcfg-${INTERFACE}${DATE}.bak ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[33m 网卡${INTERFACE}IP未修改,退出操作!!\033[0m"
exit 1
;;
esac
done
执行结果
修改后,如无法上网,IP回滚
--------------------end