Я пытался разработать простой сканер портов UDP, используя nmap, чтобы удовлетворить мои потребности, но я обнаружил, что иногда запуск одного и того же кода несколько раз дает разные результаты. Результаты UDP иногда не включаются в возвращаемый метод PortScannerYield.scan ().
.
Хост работает в обоих случаях, единственное отличие - отсутствие результатов UDP.
import nmap
import time
import sys
class UdpPortScanner:
def __init__(self):
self.nm = nmap.PortScannerYield()
@staticmethod
def parse_results(result):
results = []
for host, listed in result.items():
state = listed["scan"][host]["status"]["state"]
if state == "up":
try:
for port in listed["scan"][host]["udp"]:
entry = (
host, port, listed["scan"][host]["udp"][port]["state"], listed["scan"][host]["udp"][port]["name"])
results.append(entry)
except KeyError as e:
print("Didn't find a key: " + str(e))
else:
print(host, "is", state)
return results
def scan(self, target_ips='127.0.0.1', arguments='-sUV -T4 -F --version-intensity 0'):
result = dict()
for key, value in self.nm.scan(hosts=target_ips, arguments=arguments):
for row in UdpPortScanner.parse_results({key: value}):
print(*row)
result[key] = value
return result
if __name__ == "__main__":
scanner = UdpPortScanner()
if len(sys.argv) < 2:
domain_address = input('Enter the host to be scanned: ')
else:
domain_address = sys.argv[1]
if len(sys.argv) < 3:
scan_type = input('Determine nmap args or type 0 to scan for most common 1000 ports: ')
else:
scan_type = ""
for x in sys.argv[2:]:
scan_type += x + " "
print()
start = time.time()
if scan_type == "0":
scan_result = scanner.scan(target_ips=domain_address)
else:
scan_result = scanner.scan(target_ips=domain_address, arguments=scan_type)
print("\nTime taken: ", time.time() - start)
Is это что-то, что я делаю неправильно или это ошибка в python -nmap?