Linux Shell 一键修改双网卡信息(/etc/network/interfaces)


参考文章

  1. 使用Debian系linux脚本修改interfaces文件实现永久修改ip地址
  2. centos 在线服务器一键IP修改_超终级版本(脚本实战)

前言

本文章中shell脚本主要实现:
在网卡配置文件 “/etc/network/interfaces” 中
根据网卡名称 eth0/eth1,修改和获取双网卡IP信息和MAC信息。


一、功能

脚本功能

  1. 实现双网卡IP信息和MAC地址修改和获取(根据网卡名称eth0/eth1)
  2. 实现创建网卡配置文件
  3. 实现将动态IP修改为静态IP
  4. 检查IP是否合法
  5. 检测IP是否冲突
  6. 检测网关是否畅通
  7. 检查MAC是否合法

二、代码

#!/bin/bash
#auto alter ip
#auth by toyix
#202071810: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

总结

目前只是简单实现了功能,后续还需进一步优化。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这两个文件都是用来配置网络接口的文件,但是它们所处的位置和使用方法有所不同。 /root/Local/interfaces是Ubuntu下的网络接口配置文件,它通常用于配置静态IP地址,DNS服务器等网络参数。这个文件只对当前登录的用户可见,而不是全局设置,因此每个用户都可以有自己的网络配置。 /etc/network/interfaces则是Debian系列操作系统中的网络接口配置文件,它通常用于配置系统全局的网络参数。这个文件可以设置多个网络接口的配置信息,包括IP地址、子网掩码、网关等等。 需要注意的是,这两个文件都需要root权限才能编辑和保存,因为它们涉及到系统的网络配置。 ### 回答2: 在Linux中,root/Local/interfaces和etc/network/interfaces是两个不同的文件,用于配置网络接口。 /root/Local/interfaces是root用户的个人配置文件,它仅适用于当前用户,不会影响其他用户或整个系统。在该文件中,可以设置特定用户的网络接口配置,比如设置IP地址、子网掩码、网关等。这个文件的路径是/root/Local/interfaces。 /etc/network/interfaces是系统级别的网络接口配置文件,它适用于整个系统的所有用户和网络接口。在这个文件中,可以定义和配置系统中的各个网络接口(如eth0、eth1等),包括设置静态IP地址、动态获取IP地址(DHCP)、网络协议版本(IPv4或IPv6)等。这个文件的路径是/etc/network/interfaces。 通常情况下,我们更常用的是/etc/network/interfaces文件来配置网络接口,因为它可以一次性设置整个系统中的所有接口,便于系统管理。而/root/Local/interfaces则是用于特定用户的个人配置,适合个性化的需求。 总的来说,这两个文件都是配置Linux系统中网络接口的重要文件,但是它们的作用范围和使用方式略有不同。 ### 回答3: 在Linux中,root/Local/interfaces和/etc/network/interfaces都是与网络配置相关的文件。然而,它们位于不同的位置并具有不同的作用。 root/Local/interfaces是一个私有的网络配置文件,仅对当前用户有效。在该文件中,可以定义与当前用户相关的网络接口、IP地址、子网掩码、网关等信息。这个文件通常不会影响到系统的整体网络配置。用户可以根据需求自定义这个文件,如指定某个网络接口的静态IP地址。 而/etc/network/interfaces是系统级别的网络配置文件,它适用于整个系统的网络接口。在该文件中,可以定义系统的网络接口、IP地址、子网掩码、网关以及DNS服务器等信息。这个文件的配置会影响到整个系统的网络行为。通常,系统管理员会根据具体需求来修改该文件,如配置服务器的网络接口为静态IP地址。 总结起来,root/Local/interfaces是当前用户的私有网络配置文件,而/etc/network/interfaces是系统级别的网络配置文件。前者用于自定义当前用户相关的网络接口信息,后者用于配置整个系统的网络接口信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值