参考文章
前言
本文章中shell脚本主要实现:
在网卡配置文件 “/etc/network/interfaces” 中
根据网卡名称 eth0/eth1,修改和获取双网卡IP信息和MAC信息。
一、功能
脚本功能
- 实现双网卡IP信息和MAC地址修改和获取(根据网卡名称eth0/eth1)
- 实现创建网卡配置文件
- 实现将动态IP修改为静态IP
- 检查IP是否合法
- 检测IP是否冲突
- 检测网关是否畅通
- 检查MAC是否合法
二、代码
#!/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
#定义函数 - 校验IP地址是否正确
DEFINE_IPADDR_VERIFY () {
echo ${NEW_IPADDR}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
if [ $? -ne 0 ] ;then
echo -e "\033[33m----------------------------------------------------------\033[0m"
echo -e "\033[33m IP(${NEW_IPADDR})定义不正确,请重新输入 : \033[0m"
echo -e "\033[33m----------------------------------------------------------\033[0m"
exit -2
fi
}
#定义函数 - 检测是否会IP冲突
DEFINE_IPADDR_CONFLICT_VERIFY () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo " 检测IP中,请稍等2秒..."
ping -c 2 "${NEW_IPADDR}" |grep "ttl" >/dev/null 2>&1
if [ $? -eq 0 ] ;then
echo -e "\033[33m IP冲突,请重新输入:\033[0m"
echo -e "\033[32m----------------------------------------------------------\033[0m"
exit -3
fi
echo -e "\033[32m IP定义成功!! \033[0m"
echo -e "\033[32m----------------------------------------------------------\033[0m"
}
#定义函数 - 校验子网掩码是否正确
DEFINE_NETMASK_VERIFY () {
echo ${NEW_NETMASK}|grep -iwE '^255\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
if [ $? -ne 0 ] ;then
echo -e "\033[33m----------------------------------------------------------\033[0m"
echo -e "\033[33m 子网掩码(${NEW_NETMASK})定义不正确,请重新输入 :\033[0m"
echo -e "\033[33m----------------------------------------------------------\033[0m"
exit -4
fi
}
#定义函数 - 校验网关是否正确
DEFINE_GATEWAY_VERIFY () {
echo ${NEW_GATEWAY}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
if [ $? -ne 0 ] ;then
echo -e "\033[33m----------------------------------------------------------\033[0m"
echo -e "\033[33m 网关(${NEW_GATEWAY})定义不正确,请重新输入 : \033[0m"
echo -e "\033[33m----------------------------------------------------------\033[0m"
exit -5
fi
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo " 检测网关中,请稍等2秒..."
ping -c 2 "${NEW_GATEWAY}"|grep -iE "ttl" >/dev/null 2>&1
if [ $? -ne 0 ] ;then
echo -e "\033[33m 网关(${NEW_GATEWAY})不通,请重新输入正确网关 :\033[0m"
echo -e "\033[32m----------------------------------------------------------\033[0m"
exit -6
fi
echo -e "\033[32m 网关定义成功!\033[0m"
echo -e "\033[32m----------------------------------------------------------\033[0m"
}
#定义函数 - 校验MAC地址是否正确
DEFINE_MACADDR_VERIFY () {
if [ ! -n "${NEW_MACADDR}" ] ;then
return
fi
echo ${NEW_MACADDR}|grep -iwE '^([0-9a-fA-F]{2})(([/\s:][0-9a-fA-F]{2}){5})$' >/dev/null 2>&1
if [ $? -ne 0 ] ;then
echo -e "\033[33m----------------------------------------------------------\033[0m"
echo -e "\033[33m MAC(${NEW_MACADDR})定义不正确,请重新输入 : \033[0m"
echo -e "\033[33m----------------------------------------------------------\033[0m"
exit -7
fi
}
#定义函数 - 修改配置文件中不同网卡的:IP地址、子网掩码、网关、MAC地址
DEFINE_CONFIG_MODIFY () {
if [[ ${INTERFACE} == "eth0" ]];then
SCAN_RANGE='/^auto eth0/,/^auto eth1/'
elif [[ ${INTERFACE} == "eth1" ]];then
SCAN_RANGE='/^auto eth1/,$'
else
echo ""
echo -e "\033[33m 未找到 auto ${INTERFACE},在网卡${INTERFACE}配置文件中!!\033[0m"
exit -1
fi
if [[ ${DHCP_OR_STATIC} == "dhcp" ]];then
sed -i "/^${STATIC_INDEX} /s/dhcp/static/" ${INTERFACE_DIR}
fi
#sed -i "${SCAN_RANGE} s/^${IPADDR_INDEX}.*/${IPADDR_INDEX} ${NEW_IPADDR}/" ${INTERFACE_DIR}
sed -i "${SCAN_RANGE} s/${OLD_IPADDR}/${NEW_IPADDR}/" ${INTERFACE_DIR}
OLD_IPADDR=$(sed -n "${SCAN_RANGE} s/^${IPADDR_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
if [ ${OLD_IPADDR} != ${NEW_IPADDR} ];then
echo -e "\033[33m 设置 ${IPADDR_INDEX} 失败!!\033[0m"
exit -1
fi
#sed -i "${SCAN_RANGE} s/^${NETMASK_INDEX}.*/${NETMASK_INDEX} ${NEW_NETMASK}/" ${INTERFACE_DIR}
sed -i "${SCAN_RANGE} s/${OLD_NETMASK}/${NEW_NETMASK}/" ${INTERFACE_DIR}
OLD_NETMASK=$(sed -n "${SCAN_RANGE} s/^${NETMASK_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
if [ ${OLD_NETMASK} != ${NEW_NETMASK} ];then
echo -e "\033[33m 设置 ${NETMASK_INDEX} 失败!!\033[0m"
exit -1
fi
if [[ ${INTERFACE} == "eth0" ]];then
#sed -i "${SCAN_RANGE} s/^${GATEWAY_INDEX}.*/${GATEWAY_INDEX} ${NEW_GATEWAY}/" ${INTERFACE_DIR}
sed -i "${SCAN_RANGE} s/${OLD_GATEWAY}/${NEW_GATEWAY}/" ${INTERFACE_DIR}
OLD_GATEWAY=$(sed -n "${SCAN_RANGE} s/^${GATEWAY_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
if [ ${OLD_GATEWAY} != ${NEW_GATEWAY} ];then
echo -e "\033[33m 设置 ${GATEWAY_INDEX} 失败!!\033[0m"
exit -1
fi
fi
if [ -n "${NEW_MACADDR}" ] ;then
#sed -i "${SCAN_RANGE} s/.*${MACADDR_INDEX}.*/pre-up ifconfig \$IFACE ${MACADDR_INDEX} ${NEW_MACADDR}/" ${INTERFACE_DIR}
sed -i "${SCAN_RANGE} s/${OLD_MACADDR}/${NEW_MACADDR}/" ${INTERFACE_DIR}
OLD_MACADDR=$(sed -n "${SCAN_RANGE} s/.*${MACADDR_INDEX}.*/&/p" ${INTERFACE_DIR} |awk '{print $6}')
if [ ${OLD_MACADDR} != ${NEW_MACADDR} ];then
echo -e "\033[33m 设置 ${MACADDR_INDEX} 失败!!\033[0m"
exit -1
fi
fi
echo ""
echo -e "\033[32m 已生成网卡${INTERFACE}配置文件,见下: \033[0m"
cat ${INTERFACE_DIR}
}
#定义函数 - 获取配置文件中不同网卡的:IP地址、子网掩码、网关、MAC地址
DEFINE_CONFIG_GET () {
if [[ ${INTERFACE} == "eth0" ]];then
SCAN_RANGE='/^auto eth0/,/^auto eth1/'
elif [[ ${INTERFACE} == "eth1" ]];then
SCAN_RANGE='/^auto eth1/,$'
else
echo ""
echo -e "\033[33m 未找到 auto ${INTERFACE},在网卡${INTERFACE}配置文件中!!\033[0m"
exit -1
fi
IPADDR_INDEX="address"
NETMASK_INDEX="netmask"
GATEWAY_INDEX="gateway"
MACADDR_INDEX="hw ether"
STATIC_INDEX="iface ${INTERFACE} inet"
DHCP_OR_STATIC=`grep "^${STATIC_INDEX}" ${INTERFACE_DIR} |sed -n '1p' |awk '{print $4}'`
OLD_IPADDR=$(sed -n "${SCAN_RANGE} s/^${IPADDR_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
OLD_NETMASK=$(sed -n "${SCAN_RANGE} s/^${NETMASK_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
OLD_GATEWAY=$(sed -n "${SCAN_RANGE} s/^${GATEWAY_INDEX}/&/p" ${INTERFACE_DIR} |awk '{print $2}')
OLD_MACADDR=$(sed -n "${SCAN_RANGE} s/.*${MACADDR_INDEX}.*/&/p" ${INTERFACE_DIR} |awk '{print $6}')
echo ""
echo DHCP_OR_STATIC = ${DHCP_OR_STATIC}
echo OLD_IPADDR = ${OLD_IPADDR}
echo OLD_NETMASK = ${OLD_NETMASK}
echo OLD_GATEWAY = ${OLD_GATEWAY}
echo OLD_MACADDR = ${OLD_MACADDR}
}
#定义函数 - 创建网络配置文件
DEFINE_CONFIG_CREATE (){
cat>${INTERFACE_DIR}<<-EOF
auto eth0
iface eth0 inet static
pre-up ifconfig $IFACE down
pre-up ifconfig $IFACE hw ether 00:0A:35:00:10:10
pre-up ifconfig $IFACE up
address 192.168.10.10
netmask 255.255.255.0
gateway 192.168.10.1
auto eth1
iface eth1 inet static
pre-up ifconfig $IFACE down
pre-up ifconfig $IFACE hw ether 00:0A:35:00:20:20
pre-up ifconfig $IFACE up
address 192.168.20.20
netmask 255.255.255.0
#gateway 192.168.20.1
EOF
}
DEFINE_CONFIG_BACKUP(){
#备份网卡文件
\rm -f ${INTERFACE_DIR}*.bak
\cp ${INTERFACE_DIR}{,${DATE}.bak}
#备份DNS配置文件
\cp /etc/resolv.conf{,.bak}
}
DEFINE_CONFIG_ROLLBACK(){
\mv ${INTERFACE_DIR}${DATE}.bak ${INTERFACE_DIR}
}
#定义函数 - 重启网络
DEFINE_RESTART_NETWORK (){
echo ""
echo -e "\033[32m 网卡${INTERFACE}IP修改成功,网络重启中,请使用新IP链接服务器................the end !\033[0m"
#先清空网卡配置,再重启网卡重新加载配置
ip addr flush dev ${INTERFACE}
systemctl restart networking.service
#恢复dns配置文件
\cp /etc/resolv.conf.bak /etc/resolv.conf
ifconfig
}
#定义函数 - 检测新IP是否能上网
DEFINE_INTERNET_ACCESS_DETECTION (){
#查看是否能上网
echo ""
echo -e "\033[32m ping -c 5 www.baidu.com 测试能否上网\033[0m"
ping -c 5 www.baidu.com
if [ $? -ne 0 ];then
echo -e "\033[33m -----------------------\033[0m"
echo -e "\033[33m 无法上网 !!\033[0m"
echo -e "\033[33m -----------------------\033[0m"
# \mv ${INTERFACE_DIR}${DATE}.bak ${INTERFACE_DIR}
# systemctl restart networking.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
else
echo -e "\033[32m -----------------------\033[0m"
echo -e "\033[32m 可以上网 !!\033[0m"
echo -e "\033[32m -----------------------\033[0m"
fi
}
#定义函数 - 解析用户指令中的:网卡、IP地址、子网掩码、网关、MAC地址
DEFINE_NETWORK_PARAMETER_PARSE(){
INTERFACE=$1
NEW_IPADDR=$2
NEW_NETMASK=$3
NEW_GATEWAY=$4
NEW_MACADDR=$5
echo INTERFACE = ${INTERFACE}
echo NEW_IPADDR = ${NEW_IPADDR}
echo NEW_NETMASK = ${NEW_NETMASK}
echo NEW_GATEWAY = ${NEW_GATEWAY}
echo NEW_MACADDR = ${NEW_MACADDR}
INTERFACE_DIR="/etc/network/interfaces"
DEFINE_CONFIG_GET
}
echo ""
echo -e "\033[32m#################################################################\033[0m"
#INTERFACE_CHOOSE
#DEFINE_IPADDR_NEW
#CHECK_IP_conflict
#DEFINE_NETMASK_NEW
#DEFINE_GATEWAY
#输入:./qtool_ipaddr_change.sh 网卡 新IP 新子网 新网关 新MAC
#如:./qtool_ipaddr_change.sh eth0 192.168.0.215 255.255.255.0 192.168.0.1 00:0A:35:00:10:11
DEFINE_NETWORK_PARAMETER_PARSE $1 $2 $3 $4 $5
DEFINE_IPADDR_VERIFY
#DEFINE_IPADDR_CONFLICT_VERIFY
DEFINE_NETMASK_VERIFY
if [[ ${INTERFACE} == "eth0" ]];then
DEFINE_GATEWAY_VERIFY
fi
DEFINE_MACADDR_VERIFY
#DEFINE_CONFIG_GET
DEFINE_CONFIG_BACKUP
DEFINE_CONFIG_MODIFY
DEFINE_RESTART_NETWORK
#DEFINE_INTERNET_ACCESS_DETECTION
echo -e "\033[32m#################################################################\033[0m"
echo ""
exit 0
#\mv ${INTERFACE_DIR}${DATE}.bak ${INTERFACE_DIR}
#echo -e "\033[33m 网卡${INTERFACE}IP未修改,退出操作!!\033[0m"
三、执行
输入:
./qtool_ipaddr_change.sh 网卡 新IP 新子网 新网关 新MAC
如:
./qtool_ipaddr_change.sh eth0 192.168.0.215 255.255.255.0 192.168.0.1 00:0A:35:00:10:11
总结
目前只是简单实现了功能,后续还需进一步优化。