本次实现对某个网段的主机端口(0—65535)扫描,因为端口较多进而耗时较长,可根据实际情况指定扫描的范围
import nmap import os import threading import time from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ProcessPoolExecutor IP_list = [] lock = threading.Lock() pool = ThreadPoolExecutor(5) # 写入文件操作 def openfile(path, content): with open(path, 'W+')as f: f.write(content+' ') # 查看当前主机操作系统 def find_os(ip): ret = os.popen("nmap -O %s" % ip).read().split(' ') for i in ret: if 'Running' in i: return i continue return 'noting' # 局域网存活的主机 def ping_ip(ip): output = os.popen('ping -n 1 %s' % ip).readlines() for w in output: if str(w).upper().find('TTL') >= 0: print(ip) IP_list.append(ip) pool.submit(nmapScan, ip) def Alive_host(ip): wd_ip = '.'.join(ip.split('.')[:-1]) for i in range(1, 256): new_ip = wd_ip + '.' + str(i) t = threading.Thread(target=ping_ip, args=(new_ip,)) t.start() time.sleep(0.01) def nmapScan(ip): port_list = [] nm = nmap.PortScanner() ret = nm.scan(hosts=ip, arguments='-v -n -A')['scan'][ip]['tcp'] for port in ret: port_list.append(str(port)) content = ip+" "+find_os(ip)+" "+','.join(port_list) print(content) openfile('./result', content) if __name__ == '__main__': Alive_host('192.168.16.0/24')
关于对“192.168.0.0/24” 的理解
24是CIDR值。简单说就是一个CIDR值对应一个子网掩码,然后对网络就行分段。
/24对应的是255.255.255.0,与ip作位运算,将挡住的部分作为网段,其余部分做电脑的地址,如 192.168.0 属于网段
192.168.0.0/24就代表了192.168.0.0至192.168.0.255
一直分下去有 192.168.1.0至192.168.1.255
192.168.2.0至192.168.2.255等等
每个IP地址的长度为32位(bit),分4段,每段8位(1个字节)。简单的说24代表从前往后有24个1,就是11111111.11111111.11111111.00000000