У меня есть скрипт python, который сравнивает 2 отчета о проверке и находит, что изменилось в результатах 2 сканирования. Я написал метод, который сравнивает порт для каждого хоста со старым хостом в предыдущем результате сканирования. Я использую collections.defaultdict
, чтобы иметь все чистое, чтобы я не создавал пустой набор, если хост не найден в новом сканировании.Объект 'set' не имеет атрибутов 'items', а итерация в python
Метод сравнения изменения порта выглядит следующим образом:
def comp_ports(self,filename):
try:
f = open(filename)
self.prev_report = pickle.load(f) # NmapReport
self.old_port_dict = collections.defaultdict(set)
for s in self.prev_report.hosts:
for x in s.get_open_ports():
self.old_port_dict[s.address].add(x)
self.new_port_dict = collections.defaultdict(set)
for s in self.report.hosts:
for x in s.get_open_ports():
self.new_port_dict[s.address].add(x)
hosts = sorted(set(self.old_port_dict) | set(self.new_port_dict))
scan_same = dict()
scan_new = dict()
scan_del = dict()
prev_set = set(self.prev_report.hosts)
new_set = set(self.report.hosts)
scan_same = prev_set & new_set
scan_new = new_set - prev_set
scan_del = prev_set - new_set
print()
print('-' * 10, 'Same')
for host, ports in scan_same.items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
print()
print('*' * 10, 'Added')
for host, ports in scan_new().items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
print()
print('=' * 10, 'Deleted')
for host, ports in scan_del().items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
except Exception as l:
print l
raise
Это вызывает исключение:
'set' object has no attribute 'items'
Traceback (most recent call last):
File "portwatch.py", line 316, in <module>
report.comp_ports(config.get('system','scan_directory') + '/nmap-report-old.pkl')
File "portwatch.py", line 159, in comp_ports
for host, ports in scan_same.items():
AttributeError: 'set' object has no attribute 'items'
В результате сканирования, сохраненного в old_scan_result.pl и new_scan_result.pl; prev_report.hosts
- объект рассола для получения предыдущего результата сканирования & report.hosts
- объект рассола, чтобы получить текущий результат сканирования.
я ожидал выход как:
---------- Same
172.16.0.163 :
::: 80/tcp
::: 22/tcp
172.16.0.41 :
::: 80/tcp
*********** Added
172.16.0.163 :
172.16.0.41 :
::: 22/tcp
========== Deleted
172.16.0.163 :
172.16.0.41 :
::: 666/tcp
Ну, 'scan_same' - это набор:' scan_same = prev_set & new_set', а не словарь. –
точно, так как это сделать? я имею в виду, что набор должен быть преобразован в dict или что-то в этом роде. Я новичок, поэтому я не могу понять это – PythonFreak
, вы можете перебирать множество так же, как и в любой последовательности, 'для элемента в seq:' –