Проблема логики при сравнении строк с именами пользователей - PullRequest
0 голосов
/ 07 декабря 2018

Таким образом, я выгружаю выходные данные от ASA для anyconnect.Я записываю это в файл, а затем снова записываю в программу.Я открываю csv из имен пользователей за день до того, чтобы попытаться выяснить, подключен ли кто-то новый.Проблема в моей логике.Я не могу понять, как сравнить каждого пользователя (строку) в файле csv с каждой строкой из выходных данных, и если ни один из них не находится в строке, то выведите строку.Мой код найдет пользователя не в строке, а напечатает строку, если строка содержит пользователя в моем списке.Например, у меня есть usrA и usrB, если usrA не в строке, а usrB в строке, она напечатает его, даже если в моем списке есть usrB.

def compare(e):
    with open("anyconnect.csv", 'r') as usrf:
        for user in usrf:
            if user not in line:
                print(line)



def asa1(asaip0):
    device = {
        'device_type': 'cisco_asa',
        'ip': asaip0,
        'username': ("username"),
        'password': ("password"),
        'secret': ("password"),
        'port': 22,
        }

    with open(asaip0 + ".txt", 'w') as of:
        with open("log.csv", 'w') as log:
            net_connect = netmiko.ConnectHandler(**device)
            output = net_connect.send_command("show logging | grep LOCAL")
            of.writelines(output)
            log.writelines(output)
            log.close()

        with open("log.csv", 'r') as log:
            for line in log:
                compare(line)

###### MAIN ######
if __name__ == "__main__":

    asa1 = ('10.210.92.4')
    asa2 = ('10.210.109.4')
    ips = (asa1, asa2)
    asa1(asa1)
    asa1(asa2)

1 Ответ

0 голосов
/ 07 декабря 2018

( У вас происходят странные вещи с именами переменных, так что это написано с некоторыми предположениями )

Один из вариантов - изменить это на что-то вроде:

def compare(line):
    with open("anyconnect.csv", 'r') as usrf:
        user_found = False
        for user in usrf:
            if user in line:
                user_found = True
                break        # Not necessary, but will speed things up

        if not user_found:
            print(line)

Здесь нас интересует только, находится ли line (аргумент) в любых из user строк (из файла anyconnect).

Определенно, есть лучший способ, чем открывать и перебирать все циклы для каждого вызова compare(e) (например, прочитать его один раз, извлечь известные имена пользователей, создать набор и использовать e in your_set), но это должно помочь вамначалось.

Даже что-то вроде:

with open("anyconnect.csv", 'r') as usrf:
    ANYCONNECT = [line for line in usrf]

def is_known(name):
    return any(name in line for line in ANYCONNECT)

Было бы более эффективным

...