前言:我是脚本/编程的新手,我将其作为一种有助于工作的学习工具。
我制作了一个小的python 2.7脚本来运行每日nmap ping扫描,以查看我的服务器是否已启动并运行。
该脚本运行正常,但由于服务器回复滞后,我的最终比较失败,最终使列表与基线列表不同以进行比较。
例如:
Baseline.txt具有以下信息
Host:10.0.1.2 status up
Host:10.0.1.3 status up
Host:10.0.1.4 status up
Host:10.0.1.5 status up
当脚本运行时,由于滞后而返回以下内容:
Host:10.0.1.5 status up
Host:10.0.1.2 status up
Host:10.0.1.4 status up
Host:10.0.1.3 status up
信息相同,但顺序不同,脚本会将两个文件视为不同,并报告发生了更改。 (我使用简单的if语句进行比较,这可能是我的问题)
有没有办法迭代文件的每一行,将它与基线文件的每一行进行比较,如果有信息,请将其读取为无变化?或者我完全错了吗?
以下是需要的代码:
import smtplib
#Method for emailing if a problem arises
def notify():
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = 'SERVER_ALERT@company.com'
recipient = 'me@me.com'
subject = 'SERVER STATUS ALERT'
body = 'Check all servers for an unscheduled change!'
body = "" + body + ""
headers = ["From: " + sender,
"Subject: " + subject,
"To: " + recipient,
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "\r\n".join(headers)
session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
session.ehlo()
session.starttls()
session.login('notify_me@me.com', 'password')
session.sendmail(sender, recipient, headers + "\r\n\r\n" + body)
session.quit()
#Scanning with nmap and naming the scan the date
timestr = time.strftime("%m-%d-%y")
daily_scan = open(timestr+".txt", 'w')
os.system("nmap -sn -iL ip_list.txt -oG scan.txt")
scan_data = open("scan.txt", 'r').readlines()
#Checking for changes
for line in scan_data:
if "Host:" in line:
daily_scan.write(str(line))
daily_scan.close()
os.system('rm scan.txt')
baseline = open('baseline.txt', 'r').readlines()
daily_check = open(timestr+".txt", 'r').readlines()
if baseline == daily_check:
exit()
else:
notify()
答案 0 :(得分:1)
看起来如果用
替换最后一行if sorted(baseline) == sorted(daily_check):
exit()
你可以得到你想要的东西。
答案 1 :(得分:1)
>>> b = open('baseline.txt').readlines()
>>> r = open('return.txt').readlines()
>>> b == sorted(r)
True
要进行防御性编程,如果将来某些代码更改为baseline.txt未排序,我们可以改为使用此测试:
sorted(b) == sorted(r)
最后,您可能想要比简单的相等测试更有用的信息。考虑:
problems = [ line for line in r if line not in b ]
if problems:
notify()
else:
exit()
这将problems
分配给基线的任何更改,换句话说,r
中b
中的任何行也不会在r
中显示为未更改。此代码不依赖于排序。如果问题中没有行,则计算结果为false并退出代码。如果notify
中的任何行不同,则会调用problems
。要提供更具信息性的输出,您可以将notify
列表传递给{{1}}。