python端口扫描(扫描0到1023端口)

这学期选修了“信息安全”专业的《网络安全》课程,这是网络安全课程的第一个实验,要求写一个程序,多线程扫描目的主机的端口。

很简单的一个小程序,鉴于正在学python,所以就用python写了,刚学python,所以可能有点不pythonic.

#!/usr/bin/env python

# Time-stamp: <2013-06-04 10:35:58 Tuesday by pein>

# Email: 

# -*- coding: utf-8 -*-

import threading
import socket


def scan(ip, port):
    """
    """
    global portList   #建立了一个list,将目的主机开放的端口号加入portlist中(使用append函数)
    try:
        sk = socket.socket()
        sk.settimeout(0.1)#设定连接时的超时限制,这里是100ms
        address = (ip, port)
        if sk.connect_ex(address) == 0:
            print port
            portList.append(port)
    except Exception, e:
        print "error %s" %e   #如果出错,打印错误信息
        
    sk.close()

class sniff(threading.Thread):
    """
    """
    
    def __init__(self, ip):
        """
        """
        threading.Thread.__init__(self)
        self.ip = ip

    def run(self): #重写run函数
        """
        """
        global portBegin, portEnd, mutex
        while True:
            mutex.acquire()   #使用锁来实现线程同步
            portBegin += 1
            if portBegin > portEnd:
                mutex.release()
                break
            mutex.release()
            scan(self.ip, portBegin)

def main():  #主函数
    """
    """
    url = str(raw_input("please input a host name or a ip address\n--->"))
    ip = str(socket.gethostbyname(url))

    threads = []           #创建list,存储线程
    global mutex, portBegin, portEnd, portList
    portList = []
    portBegin = 0          #设置起始的扫描端口
    portEnd = 1023         #设置终止的扫描端口
    mutex = threading.Lock()
    for i in range(10):    #开了十个线程
        thread = sniff(ip)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()       #等段子线程退出

    portList.sort()
    print "on host \"",url,"\" port:[",
    for port in portList:
        print port,
    print "]is open"

main()    
        
主要思想就是建立socket,然后使用threading模块开了十个线程,并行扫描目的主机的0~1023号端口。

并使用了锁机制来实现线程同步。

输入的时候可以直接域名,也可以直接输入ip地址。

使用本机ip测试:

python端口扫描(扫描0到1023端口)_第1张图片


使用本地域名测试

python端口扫描(扫描0到1023端口)_第2张图片

启动本机的http服务,即开启本机的80端口:

python端口扫描(扫描0到1023端口)_第3张图片

可以看到端口80已经被扫描到了,证明程序有效。

(程序中的中文注释在运行时要删掉,否则会提示有不能识别的编码)

你可能感兴趣的:(python)