2016-01-25 5 views
-5

У меня есть скрипт 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 
+5

Ну, 'scan_same' - это набор:' scan_same = prev_set & new_set', а не словарь. –

+0

точно, так как это сделать? я имею в виду, что набор должен быть преобразован в dict или что-то в этом роде. Я новичок, поэтому я не могу понять это – PythonFreak

+0

, вы можете перебирать множество так же, как и в любой последовательности, 'для элемента в seq:' –

ответ

1

Получить хосты из набора и получить порты от dict. Например, для «того же»:

print() 
print('-' * 10, 'Same') 
for host in scan_same: 
    print(host, ':') 
    for port in self.new_port_dict[host]: 
     print(':::', port[0], '/', port[1]) 
+0

спасибо, суп – PythonFreak

-1

В основном ваш вопрос сводится к

i_think_this_is_a_dict = dict() 

i_think_this_is_a_dict = set(1, 2, 3) & set(3, 4, 5) 
#but now it is a set. 

i_think_this_is_a_dict.items() 

вещи, переменные, после назначения пересечения множеств к нему не относится к Dict больше, а к набору.

+0

Но как я могу заставить его работать? я имею в виду, если я хочу итерации dict .. Я также обновил вопрос и показал ожидаемый результат – PythonFreak

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/11017157) –

+0

@ivan_pozdeev Почему это не попытка ответить на вопрос? – Trilarion

Смежные вопросы