首页 > 解决方案 > 使用 Python 进行 Linux 静态路由规则文件格式转换

问题描述

我想把存储在Linux中/etc/sysconfig/network-scripts/route- interface文件中的静态路由配置规则从这种格式转换

ADDRESS0=X.X.X.X
NETMASK0=X.X.X.X
GATEWAY0=X.X.X.X
ADDRESS1=X.X.X.X
NETMASK1=X.X.X.X
GATEWAY1=X.X.X.X

X.X.X.X/X via X.X.X.X  (i.e) IP/prefix via Gateway
X.X.X.X/X via X.X.X.X

使用蟒蛇。

有没有图书馆可以这样做?

我已经通过以下方式进行了尝试(尚未完成):

import glob
import fileinput
import os,sys

files = glob.glob('./route-*')
if files:
    for f in files:
        if os.path.isfile(f):
           listoflines = []
           i = 0
           for line in open(f):
               flag = 0
               if line.startswith("ADDRESS" + str(i)):
                   listoflines.append([])
                   listoflines[i].append(line.strip().split("=")[1])
                   flag = 1
               elif line.startswith("NETMASK" + str(i)):
                   netmask = line.strip().split("=")[1]
                   prefix = sum([bin(int(n)).count("1") for n in netmask.split(".")])
                   listoflines[i][0] = listoflines[i][0] + "/" + str(prefix)
                   flag = 2
               elif line.startswith("GATEWAY" + str(i)):
                   listoflines[i][2] = line.split("=")[1]
                   flag = 3
               if flag == 3:
                   listoflines[i][1] = "via"
                   i += 1
           print listoflines

欢迎输入上述代码!

标签: pythonlinux

解决方案


使用正则表达式:

演示:

import re
s = """ADDRESS0=I1.X.X.X            
NETMASK0=X.X.X.X
GATEWAY0=G1.X.X.X
ADDRESS1=I2.X.X.X
NETMASK1=X.X.X.X
GATEWAY1=G2.X.X.X"""    #--> s represents content from file

ipVals = re.findall("ADDRESS\d+\=(.*)", s, flags=re.IGNORECASE)
gateWayVals = re.findall("GATEWAY\d+\=(.*)", s, flags=re.IGNORECASE)

for i, g in zip(ipVals, gateWayVals):
    stringToWrite = "{0} via {1}".format(i, g)
    print(stringToWrite)      # --> Write back to file

输出:

I1.X.X.X via G1.X.X.X
I2.X.X.X via G2.X.X.X

推荐阅读