因此,我正在为任何连接转储ASA的输出。我正在将其写入文件,然后将其读回程序。我从前一天开始打开一个用户名的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)
答案 0 :(得分:2)
(您在使用变量名时会发生一些奇怪的事情,因此这是在一些假设的前提下编写的)
一种选择是将其更改为:
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
行中的{strong> any 中的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)
会更有效率