Python3、从文件中提取信息问题

Python 3, extract info from file problems

再次寻求帮助。但是,在我开始之前,这里会有很多文字,所以请见谅。 我有大约 500~ IP 地址和 .xlsx 书中的设备 2x 类别 我想: 远程登录到设备。检查设备(通过身份验证提示)类型 1 或类型 2。

如果设备是类型 1 - 在 2x 分区中获取它的固件版本 写入 excel 文件: 第 1 列 - IP 地址 第 2 列 - 设备类型 第 3 列 - 固件版本 第 4 列 - 保留分区中的固件版本。

如果类型 2 - 写入 excel 文件: 第 1 列 - IP 地址 第 2 列 - 设备类型

如果设备已关闭,或设备类型 3(未知)- 写入 excel 文件: 第 1 列 - IP 地址 第 2 列 - 结果(EOF,超时)

我做了什么:我能够远程登录到设备,检查设备类型,在 excel 中写入 2 列(在 1 列 IP 地址中,在 2 列中是设备类型,或者 EOF/TIMEOUT 结果) 而且,我正在将会话的完整日志写入格式为 IP_ADDRESS.txt 的文件,以便将来进行诊断。

我不明白怎么办?我不明白如何获取固件版本,并将其放在 3,4 列。 我无法理解如何实时处理当前日志会话,因此我决定将日志从主文件 (IP_ADDRESS.txt) 复制到 temp.txt 以使用它。 我不明白如何提取我需要的信息。 文件输出示例:

    Trying 10.40.81.167...

    Connected to 10.40.81.167.

    Escape character is '^]'.



    ####################################
    #                                  #
    # RADIUS authorization disabled    #
    # Enter local login/password       #
    #                                  #
    ####################################
    bt6000 login: admin
    Password: 
    Please, fill controller information at first time (Ctrl+C to abort): 
    ^C
    Controller information filling canceled.
    ^Cadmin@bt6000# firmware info
    Active boot partition:  1
    Partition 0 (reserved):
            Firmware:       Energomera-2.3.1
            Version:        10117
    Partition 1 (active):
            Firmware:       Energomera-2.3.1_01.04.15c
            Version:        10404M
    Kernel version: 2.6.38.8 #2 Mon Mar 2 20:41:26 MSK 2015
    STM32:
            Version:        bt6000 10083
            Part Number:    BT6024
            Updated:        27.04.2015 16:43:50
    admin@bt6000# 

我需要值 - 在 "Energomera" 字之后,例如保留分区的 2.3.1 和活动分区的 2.3.1_01.04.15c。 我尝试使用字符串编号和提取字符串,但根本没有任何好的结果。

下面是我的脚本的完整代码。

    import pexpect
    import pxssh
    import sys          #hz module
    import re           #Parser module
    import os           #hz module
    import getopt
    import glob                     #hz module
    import xlrd                     #Excel read module
    import xlwt                     #Excel write module
    import telnetlib                #telnet module
    import shutil

    #open excel book
    rb = xlrd.open_workbook('/samba/allaccess/Energomera_Eltek_list.xlsx')
    #select work sheet
    sheet = rb.sheet_by_name('IPs')
    #rows number in sheet
    num_rows = sheet.nrows
    #cols number in sheet
    num_cols = sheet.ncols
    #creating massive with IP addresses inside
    ip_addr_list = [sheet.row_values(rawnum)[0] for rawnum in range(sheet.nrows)]
    #create excel workbook with write permissions (xlwt module)
    wb = xlwt.Workbook()
    #create sheet IP LIST with cell overwrite rights
    ws = wb.add_sheet('IP LIST', cell_overwrite_ok=True)
    #create counter
    i = 0
    #authorization details
    port = "23"                             #telnet port
    user = "admin"                         #telnet username
    password = "12345"                  #telnet password

    #firmware ask function
    def fw_info():
        print('asking for firmware')
        px.sendline('firmware info')
        px.expect('bt6000#')

    #firmware update function
    def fw_send():
        print('sending firmware')
        px.sendline('tftp server 172.27.2.21')
        px.expect('bt6000')
        px.sendline('firmware download tftp firmware.ext2')
        px.expect('Updating')
        px.sendline('y')
        px.send(chr(13))
        ws.write(i, 0, host)
        ws.write(i, 1, 'Energomera')

    #if eltek found - skip, write result in book
    def eltek_found():
        print(host, "is Eltek. Skipping")
        ws.write(i, 0, host)
        ws.write(i, 1, 'Eltek')

    #if 23 port telnet conn. refused - skip, write result in book
    def conn_refuse():
        print(host, "connection refused")
        ws.write(i, 0, host)
        ws.write(i, 1, 'Connection refused')

    #auth function
    def auth():
        print(host, "is up! Energomera found. Starting auth process")
        px.sendline(user)
        px.expect('assword')
        px.sendline(password)

    #start working with ip addresses in ip_addr_list massive
    for host in ip_addr_list:
    #spawn pexpect connection 
        px = pexpect.spawn('telnet ' + host)
        px.timeout = 35
        #create log file with in IP.txt format (10.1.1.1.txt, for example)
        fout = open('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host),"wb")
        #push pexpect logfile_read output to log file
        px.logfile_read = fout
        try:
            index = px.expect (['bt6000', 'sername', 'refused'])
            #if device tell us bt6000 - authorize        
            if index == 0:
                auth()  
                index1 = px.expect(['#', 'lease'])
                #if "#" - ask fw version immediatly
                if index1 == 0:
                    print('seems to controller ID already set')
                    fw_info()
                #if "Please" - press 2 times Ctrl+C, then ask fw version
                elif index1 == 1:
                    print('trying control C controller ID')
                    px.send(chr(3))
                    px.send(chr(3))
                    px.expect('bt6000')
                    fw_info()
    #firmware update start (temporarily off)
    #            fw_send()

    #Eltek found - func start
            elif index == 1:
                eltek_found()
    #Conn refused - func start
            elif index == 2:
                conn_refuse()
                #print output to console (test purposes)
                print(px.before)
            px.send(chr(13))
    #Copy from current log file to temp.txt for editing
            shutil.copy2('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host), '/home/bark/expect/temp.txt')
    #EOF result - skip host, write result to excel
        except pexpect.EOF:
            print(host, "EOF")
            ws.write(i, 0, host)
            ws.write(i, 1, 'EOF')
            #print output to console (test purposes)
            print(px.before)
    #Timeout result - skip host, write result to excel
        except pexpect.TIMEOUT:
            print(host, "TIMEOUT")
            ws.write(i, 0, host)
            ws.write(i, 1, 'TIMEOUT')
            #print output to console (test purposes)
            print(px.before)
            #Copy from current log file to temp.txt for editing
            shutil.copy2('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host), '/home/bark/expect/temp.txt') 
            #count +1 to correct output for Excel
        i += 1 
    #workbook save
    wb.save('/samba/allaccess/Energomera_Eltek_result.xls')          

你们有什么建议或想法吗,伙计们,我该怎么做? 非常感谢任何帮助。

您可以使用regular expressions

示例:

>>> import re
>>> 
>>> str = """
... Trying 10.40.81.167...
... 
...     Connected to 10.40.81.167.
... 
...     Escape character is '^]'.
... 
... 
... 
...     ####################################
...     #                                  #
...     # RADIUS authorization disabled    #
...     # Enter local login/password       #
...     #                                  #
...     ####################################
...     bt6000 login: admin
...     Password: 
...     Please, fill controller information at first time (Ctrl+C to abort): 
...     ^C
...     Controller information filling canceled.
...     ^Cadmin@bt6000# firmware info
...     Active boot partition:  1
...     Partition 0 (reserved):
...             Firmware:       Energomera-2.3.1
...             Version:        10117
...     Partition 1 (active):
...             Firmware:       Energomera-2.3.1_01.04.15c
...             Version:        10404M
...     Kernel version: 2.6.38.8 #2 Mon Mar 2 20:41:26 MSK 2015
...     STM32:
...             Version:        bt6000 10083
...             Part Number:    BT6024
...             Updated:        27.04.2015 16:43:50
...     admin@bt6000#
... """
>>> re.findall(r"Firmware:.*?([0-9].*)\s", str)
['2.3.1', '2.3.1_01.04.15c']

>>> reserved_firmware = re.search(r"reserved.*\s*Firmware:.*?([0-9].*)\s", str).group(1)
>>> reserved_firmware
'2.3.1'
>>> active_firmware = re.search(r"active.*\s*Firmware:.*?([0-9].*)\s", str).group(1)
>>> active_firmware
'2.3.1_01.04.15c'
>>>