天天看點

Python 快速掃描内網存活主機端口

'''
Python 區域網路多線程掃描存活主機及端口 by 鄭瑞國
1、擷取本機作業系統名稱
2、擷取本機IP位址
3、ping指定IP判斷主機是否存活
4、ping所有IP擷取所有存活主機
5、掃描主機指定端口
   (1)建立網絡套接字
   (2)設定網絡逾時
   (3)建立連接配接
   (4)列印端口
   (5)關閉端口
6、掃描主機所有端口
   (1)循環周遊1到最大端口
   (2)啟動多線程掃描端口
   (3)短暫休眠等待
'''
import platform
import socket
import os
import threading
import time
import sys
 
IPList = []
PortList = []

def my_os():                                              #1、擷取本機作業系統名稱
    return platform.system()
 
def my_ip():                                              #2、擷取本機IP位址
    return socket.gethostbyname(socket.gethostname())
 
def ping_ip(ip):                                          #3、ping指定IP判斷主機是否存活
    global IPList
    if my_os() == 'Windows':
        p_w = 'n'
    elif my_os() == 'Linux':
        p_w = 'c'
    else:
        print('不支援此作業系統')
        sys.exit()
    output = os.popen('ping -%s 1 %s'%(p_w,ip)).readlines()
    for w in output:
        if str(w).upper().find('TTL')>=0:
            #print(ip,'Power On')
            IPList.append(ip)
 
def ping_all(ip):                                         #4、ping所有IP擷取所有存活主機
    pre_ip = (ip.split('.')[:-1])
    for i in range(1,256):
        now_ip = ('.'.join(pre_ip)+'.'+str(i))
        #ping_ip(add)
        threading._start_new_thread(ping_ip,(now_ip,))
        time.sleep(0.01)

def scan_port(ip,port):                                 #5、掃描主機指定端口
    try:
        s = socket.socket()                                 #(1)建立網絡套接字
        s.settimeout(0.000001)                                 #(2)設定網絡逾時
        s.connect((ip,port))                                #(3)建立連接配接
        #print(ip,port,'Open')                                         #(4)列印端口
        PortList.append((ip,port))
        s.close()                                           #(5)關閉端口
    except:
        pass
 
def scan_all_port(ip,max_port):                         #6、掃描主機所有端口
    for port in range(1,max_port):                          #(1)循環周遊1到最大端口
        threading._start_new_thread(scan_port,(ip,port))    #(2)啟動多線程掃描端口
        time.sleep(0.000001)                                   #(3)短暫休眠等待
 
if __name__ == '__main__':
    ping_all(my_ip())
    for ip in IPList:
        print(ip)
        scan_all_port(ip,65535)
    for port in PortList:
        try:
            serv = socket.getservbyport(int(port[1]))
            print(port,serv)
        except:
            print(port)