前天写了一篇,发现有很多问题,今天吧自己发现问题的地方都给修改后,在自己的虚拟机上面进行测试,至少目前没有发现任何问
题,所以吧前一篇给删除了,现在重新写一篇,只是工作需要所以自己摸索的,再次申明我不是大神,是菜鸟。
这个脚本在linux系统里面可以对各种脚本进行双网卡绑定(仅仅只能两两绑定),如果各位看客要三个,四个网口一起绑定的话,这
个脚本满足不了你的需求。绑定的类型是主备的,所以如果是需要冗余,负载等类型的,可以修改os.popen()的内容。废话不多说,
下面上脚本源代码。
# !/usr/bin/python
# -*- coding:utf-8 -*-
import os
import os.path
import re
import time
dir1 = "/etc/sysconfig/network-scripts/" # 定义路径
# 获取Python的版本号,如果是版本3则返回0 否则返回1
py_ver_num = 0 # 定义变量 表示版本号 0代表版本超过3版本 否则表示低于3版本
python_version = os.popen("python -V").readlines() # 获取Python的版本
if len(python_version) <= 0: # 如果长度小于0说明Python版本低于3
py_ver_num = 1
else:
# 把list转换成str并且截取后转换成int
str_version = int(str(python_version)[9:10])
if int_servion < 3: # 判断版本是多少
py_ver_num = 1
# 查询文件夹下面所有的网口
def Get_prot():
net_list = [] # 定义存放网口的list
for x in os.listdir(dir1): # 循环查询出来这个路径下面有多少文件
files = "%s/%s"% (dir1, x)
# 判断是否是文件并且正则表达式匹配以ifcfg-开头数字结束的字符串
if os.path.isfile(files) and re.search("^ifcfg-.*?[0-9]$", x):
net_list.append(x) # 吧匹配出来的文件添加到list
return net_list
# 用正则表达式找出存在的bong
def Is_bond():
list1 = [] # 0 表示已经存在的绑定 1 表示已经做过绑定的网口 2表示未做过绑定的网口
bond_list = [] # 吧存在的bond放在bond_list中
eth_list_yes = [] # 吧已经做过绑定的网口找出来
eth_list_no = [] # 吧没有做过的绑定的网口放在这里面
for x in Get_prot():
if re.search("^bond", str(x[6:])):
bond_list.append(x)
for x in Get_prot():
if not re.search("^bond", str(x[6:])):
with open("%s%s" % (dir1, x), "r") as file:
flage = 1 # 定义变量 1 表示没做过绑定,0 表示做过绑定
for line in file:
if re.search("^SLAVE=yes", line):
flage = 0
if flage == 0:
eth_list_yes.append(x)
else:
eth_list_no.append(x)
bond_list.sort()
eth_list_yes.sort()
eth_list_no.sort() # key=lambda x: x[net_eth_name()[0]:]
list1.append(bond_list)
list1.append(eth_list_yes)
list1.append(eth_list_no)
return list1
# 判断输入的bond名字是否正确
def bond_name(bondname):
if bondname == "":
print("绑定名不能为空")
return 0
if not bondname.isdigit():
print("绑定名必须是纯数字")
return 0
for x in Is_bond()[0]:
if bondname == x[10:]:
print("绑定名已经存在")
return 0
# 判断输入的ip是否正确 0 表示ip 1表示网关
def net_name(netname, num):
ip1 = ["255", "255", "255", 255]
if num == 0:
if netname == "":
print("ip不能为空")
return 0
cut_ip = netname.strip().split(".")
if len(cut_ip) != 4:
print("你输入的ip不正确")
return 0
for x in range(len(ip1)):
if not cut_ip[x].isdigit():
print("请不要随便乱输入")
return 0
if int(cut_ip[x]) > int(ip1[x]):
print("您输入的ip不正确")
return 0
else:
if netname != "":
cut_gw = netname.strip().split(".")
if len(cut_gw) != 4:
print("你输入的网关不正确")
return 0
for x in range(len(ip1)):
if not cut_gw[x].isdigit():
print("请不要随便乱输入")
return 0
if int(netname.strip().split(".")[x]) > int(ip1[x]):
print("您输入的网关不正确")
return 0
else:
return 1
# 判断网关输入的是否正确
def gw_name(ipname, gwname):
if net_name(gwname, 1) == 0:
return 0
elif net_name(gwname, 1) != 1:
cut_ip = ipname.split(".")
cut_gw = gwname.split(".")
for x in range(4):
if (x < 3) and (int(cut_ip[x]) != int(cut_gw[x])):
print("您输入的网关不太正确哦")
return 0
# 获取网口名字
def net_eth_name():
eth_name = ""
num = 0
name_list = []
for x in range(len(Is_bond()[2][0])):
str_eth = str(Is_bond()[2][0])[x]
if str_eth.isdigit():
num = x
break
eth_name = str(Is_bond()[2][0])[6:num]
name_list.append(num)
name_list.append(eth_name)
return name_list
# 判断网口输入是否正确 num =0 表示主 =1 表示备
def eth_name(ethname, num):
eth_yes =[] # 已做绑定网口
eth_no = [] # 未做绑定网口
if ethname == "":
if num == 0:
print("主网口不能为空")
return 0
else:
print("备网口不能为空")
return 0
if not ethname.isdigit():
print("请输入数字")
return 0
for x in Is_bond()[1]:
eth_yes.append(x[net_eth_name()[0]:])
for x in Is_bond()[2]:
eth_no.append(x[net_eth_name()[0]:])
iseth = 0 # 定义变量确定输入的网口是否在为绑定的网口里面
for x in range(len(eth_no)):
# 如果输入的网口在未绑定的里面 iseth就为1
if int(eth_no[x]) == int(ethname):
iseth = 1
if iseth == 0:
iseth1 = 0
for x in range(len(eth_yes)):
if int(eth_yes[x]) == int(ethname):
iseth1 = 1
if iseth1 == 0:
print("对不起,你输入的网口不存在")
return 0
else:
print("此网口已做过绑定")
return 0
return str(ethname)
# 修改网口文件
def update_eth(eth, ethname, bondname, bondethname):
file_data = ""
line_list = []
with open("%sifcfg-%s%s" % (dir1, ethname, eth), "r") as files: # 打开指定文件
for line in files: # 循环读取文件内容(按行)
line_list.append(line) # 把找到的内容 添加到一个list
for x in line_list: # 循环list 把内容一行行的读取出来
if re.search('^ONBOOT', x): # 正则表达式查询是否有ONBOOT开头或结尾的内容
file_data += "ONBOOT=yes\n" # 如果有 则替换这条内容添加到字符串
elif re.search('^BOOTPROTO', x):
file_data += "BOOTPROTO=none\n"
elif re.search("^NM_CONTROLLED", x):
file_data += "NM_CONTROLLED=no\n"
elif re.search("^UUID", x):
file_data += "# %s" % x
elif re.search("^IPADDR", x):
file_data += "# %s" % x
elif re.search("^NETMASK", x):
file_data += "# %s" % x
elif re.search("^GATEWAY", x):
file_data += "# %s" % x
elif re.search("DNS", x):
file_data += "# %s" % x
else:
file_data += x # 其它内容原封不动添加到字符串
#with open("%sifcfg-%s%s" % (dir1, ethname, eth), "w") as file: # 打开指定文件
# file.write(file_data) # 把修改后的内容全部写到源文件中
file_data = file_data.strip()
os.system('echo "%s">%s' % (file_data, bondethname))
time.sleep(1)
os.popen('echo "MASTER=bond%s">>%s' % (bondname, bondethname)) # 在源文件后面继续添加内容
os.popen('echo "SLAVE=yes">>%s' % bondethname)
print("%s%s修改成功" % (net_eth_name()[1], eth))
# 在开始绑定之前要检查所有未做过绑定的网口的NM_CONTROLLED选项,如果不修改的话,会影响脚本在xshell工具中的使用
for x in Is_bond()[2]:
print("正在检查%s" % x)
line_list1 =[]
file_data1 = ""
with open("%s%s" % (dir1, x), "r") as files:
for line in files:
line_list1.append(line)
for i in line_list1:
if re.search("^NM_CONTROLLED", i):
file_data1 += "NM_CONTROLLED=no\n"
else:
file_data1 += i
file_data1 = file_data1.strip()
os.system('echo "%s">%s%s' % (file_data1, dir1, x))
time.sleep(0.5)
print("全部检查完毕,准备开始")
judje = True
int_while = 0 # 定义变量判断while循环是否完整执行过一次
while judje:
# 这两行代码很重要,它至少实现了Python2,3版本的输入统一
if py_ver_num ==1:
input = raw_input
print("######################################################################################")
print("已经存在的绑定:%s" % Is_bond()[0])
print("已做绑定的网口:%s" % Is_bond()[1])
print("未做绑定的网口:%s" % Is_bond()[2])
print("######################################################################################")
Bond_Name = input("请输入绑定名[例:0,1,2...]:")
if bond_name(Bond_Name) == 0:
break
Bond_Ip = input("请输入绑定IP[例:192.168.1.111]:")
if net_name(Bond_Ip, 0) == 0:
break
Bond_Gw = input("请输入网关不输入表示没有[例:192.168.1.1]:")
if gw_name(Bond_Ip, Bond_Gw) == 0:
break
Zeth_Name = input("请输入绑定主网口[例:0,1,2...]")
if eth_name(Zeth_Name, 0) == 0:
break
Beth_Name = input("请输入绑定备网口[例:0,1,2...]")
if eth_name(Beth_Name, 1) == 0:
break
if eth_name(Beth_Name, 1) == eth_name(Zeth_Name, 0):
print("主备网口不能一样")
break
Bond_Dir = "%sifcfg-bond%s" % (dir1, Bond_Name)
Bond_Zeth_Name = "%sifcfg-%s%s" % (dir1, net_eth_name()[1], Zeth_Name)
Bond_Beth_Name = "%sifcfg-%s%s" % (dir1, net_eth_name()[1], Beth_Name)
os.popen("touch %s" % Bond_Dir)
time.sleep(1)
os.popen('echo "DEVICE=bond%s">%s' % (Bond_Name, Bond_Dir))
os.popen('echo "BOOTPROTO=static">>%s' % Bond_Dir)
os.popen('echo "TYPE=Ethernet">>%s' % Bond_Dir)
os.popen('echo "ONBOOT=yes">>%s' % Bond_Dir)
os.popen('echo "IPADDR=%s">>%s' % (Bond_Ip, Bond_Dir))
os.popen('echo "NETMASK=255.255.255.0">>%s' % Bond_Dir)
if Bond_Gw != "":
os.popen('echo "GATEWAY=%s">>%s' % (Bond_Gw, Bond_Dir))
os.popen("echo 'BONDING_OPTS=\"primary=%s%s mode=1 miimon=200\" '>>%s" % (net_eth_name()[1], Zeth_Name, Bond_Dir))
os.popen('echo "# bond name:bond%s">>%s' % (Bond_Name, Bond_Dir))
os.popen('echo "# net prot:%s%s,%s%s">>%s' % (net_eth_name()[1], Zeth_Name, net_eth_name()[1], Beth_Name, Bond_Dir))
time.sleep(1)
print("bond%s创建成功" % Bond_Name)
########################################################## 主网口
update_eth(Zeth_Name, net_eth_name()[1], Bond_Name, Bond_Zeth_Name)
########################################################## 备网口
update_eth(Beth_Name, net_eth_name()[1], Bond_Name, Bond_Beth_Name)
int_while += 1
flag = input("是否继续(Y/N):")
if flag == "Y" or flag == "y": #如果输入的是“Y”或“y”则继续下一次,其余的则退出
pass
else:
judje = False
if int_while > 0:
restart = input("是否重启network(Y/N):")
if restart == "Y" or restart == "y": # 如果输入Y/y则重启网络服务
os.popen("service network restart")