1. 程式人生 > >Python 快速掃描內網存活主機埠

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)