Решено в чем проблема в этом коде python

S

SmokeofCerber

Member
26.10.2019
6
0
Python:
#!/usr/bin/env python

import scapy.all as scapy
import optparse


def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-t", "--target", dest="target", help="Target IP / IP range")
    (options, arguments) = parser.parse_args()
    return options


def scan(ip):
    arp_pac = scapy.ARP(pdst=ip)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast / arp_pac
    answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0]

    clients_list = []
    for element in answered_list:
        client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc}
        clients_list.append(client_dict)
        return clients_list


def print_result(results_list):
    print("IP\t\t\t MAC Address\n----------------------------------------------")
    for client in results_list:
        print(client["ip"] + "\t\t" + client["mac"])


options = get_arguments()
scan_result = scan(options.target)
print_result(scan_result)


делал все по уроку, но у меня он выдает ошибку  в  виде
root@0:~/PycharmProjects/scan# python scan.py --target 192.168.0.1/24
IP                       MAC Address
----------------------------------------------
Traceback (most recent call last):
  File "scan.py", line 35, in <module>
    print_result(scan_result)
  File "scan.py", line 29, in print_result
    for client in results_list:
TypeError: 'NoneType' object is not iterable
root@0:~/PycharmProjects/scan#
что с этим делать
и ещё
до того как добавить аргументы прога абы как работала, но выдавала информацию только по моему роутеру хотя там и прописаном /24
я подумал, что я что-то не так сделал и заменил таким кодом
import scapy.all as scapy
def scan(ip):
scapy.arping(ip)

scan("192.168.1.1/24")
где это работало исправно
 
f22

f22

Red Team
05.05.2019
1 399
107
File "scan.py", line 35, in <module>
print_result(scan_result)
File "scan.py", line 29, in print_result
for client in results_list:
TypeError: 'NoneType' object is not iterable
Для начала читаем текст ошибки и смотрим на строку, в которой эта ошибка появилась:
python ругается на то, что в списке results_list нет элементов, а его нужно итерировать.

Смотри откуда эти элементы берутся
print_result(scan_result) -> scan_result = scan(options.target) -> def scan(ip):
То есть проблема в функции scan.

Что можно сделать? Да банально проверить, сколько элементов появилось в списке после сканирования.
Добавь простейшее условие if:
Если их меньше 0, завершать код.


Но это просто алгоритм.
Применительно к твоей ошибке:
Какая адресация в твоей подсети 192.168.0.0/24 или 192.168.1.0/24?
В первом случае ты указываешь одну, во втором другую.
Возможно он не находит хостов именно из-за этой ошибки.

но выдавала информацию только по моему роутеру хотя там и прописанном /24
Сканировать подсеть нужно, указывая последней цифрой 0 - 0/8, 0/24 и так далее
В ином случае, размерность сети просто отбрасывается и сканируется только твой роутер под соответствующим IP 192.168.1.1 или 192.168.0.1 соответственно.

В любом случае и в python и в nmap'e есть несколько модулей для получения собственного IP и определения маски подсети, для правильного сканирования внутренней сети.
 
S

SmokeofCerber

Member
26.10.2019
6
0
так программа заработала, но она по прежнему определяет только роутер и не больше
В чем проблема так и не пойму, я время отклика увеличил, но это все равно не помогло
 
HeyDude

HeyDude

Green Team
22.02.2019
41
0
отступ перед return clients_list убери. Он у тебя в цикле остался

Рабочий вариант:
Код:
#!/usr/bin/env python

import scapy.all as scapy
import optparse


def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-t", "--target", dest="target", help="Target IP / IP range")
    (options, arguments) = parser.parse_args()
    return options


def scan(ip):
    arp_pac = scapy.ARP(pdst=ip)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast / arp_pac
    answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0]

    clients_list = []
    for element in answered_list:
        client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc}
        clients_list.append(client_dict)
    return clients_list


def print_result(results_list):
    print("IP\t\t\t MAC Address\n----------------------------------------------")
    for client in results_list:
        print(client["ip"] + "\t\t" + client["mac"])


options = get_arguments()
scan_result = scan(options.target)
print_result(scan_result)
 
Последнее редактирование:
Мы в соцсетях: