python 端口扫描

python 端口扫描

import socket
import threading
from datetime import datetime
import argparse
import sys

class PortScanner:
    def __init__(self, target, ports, timeout=1, threads=100):
        self.target = target
        self.ports = ports
        self.timeout = timeout
        self.threads = threads
        self.open_ports = []
        self.lock = threading.Lock()
        
    def scan_port(self, port):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(self.timeout)
            result = sock.connect_ex((self.target, port))
            if result == 0:
                try:
                    service = socket.getservbyport(port)
                except:
                    service = "unknown"
                with self.lock:
                    self.open_ports.append((port, service))
                    print(f"[+] 端口 {port} 开放 - {service}")
            sock.close()
        except Exception as e:
            pass
    
    def scan(self):
        print(f"\n开始扫描目标: {self.target}")
        print(f"扫描端口范围: {self.ports[0]}-{self.ports[1]}")
        print(f"线程数: {self.threads}")
        print(f"超时时间: {self.timeout}秒")
        print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print("-" * 60)
        
        threads = []
        for port in range(self.ports[0], self.ports[1] + 1):
            t = threading.Thread(target=self.scan_port, args=(port,))
            threads.append(t)
            t.start()
            
            if len(threads) >= self.threads:
                for thread in threads:
                    thread.join()
                threads = []
        
        for thread in threads:
            thread.join()
        
        print("-" * 60)
        print(f"扫描完成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"\n发现 {len(self.open_ports)} 个开放端口:")
        self.open_ports.sort(key=lambda x: x[0])
        for port, service in self.open_ports:
            print(f"  端口 {port}: {service}")
        
        return self.open_ports

def main():
    parser = argparse.ArgumentParser(description='端口扫描工具')
    parser.add_argument('target', help='目标IP地址或域名')
    parser.add_argument('-p', '--ports', default='1-1024', 
                        help='端口范围,格式: start-end (默认: 1-1024)')
    parser.add_argument('-t', '--timeout', type=int, default=1,
                        help='连接超时时间(秒) (默认: 1)')
    parser.add_argument('-T', '--threads', type=int, default=100,
                        help='线程数 (默认: 100)')
    
    args = parser.parse_args()
    
    try:
        port_range = args.ports.split('-')
        start_port = int(port_range[0])
        end_port = int(port_range[1])
        
        if start_port < 1 or end_port > 65535 or start_port > end_port:
            print("错误: 端口范围无效 (1-65535)")
            sys.exit(1)
            
    except:
        print("错误: 端口范围格式不正确,应为 start-end")
        sys.exit(1)
    
    try:
        target_ip = socket.gethostbyname(args.target)
    except socket.gaierror:
        print(f"错误: 无法解析主机名 {args.target}")
        sys.exit(1)
    
    scanner = PortScanner(
        target=target_ip,
        ports=(start_port, end_port),
        timeout=args.timeout,
        threads=args.threads
    )
    
    scanner.scan()

if __name__ == "__main__":
    main()
# 扫描指定端口范围
python main.py 192.168.1.1 -p 1-65535

# 设置超时时间 (秒)
python main.py 192.168.1.1 -t 2

# 设置线程数
python main.py 192.168.1.1 -T 200

# 组合使用
python main.py example.com -p 1-10000 -t 2 -T 150

 

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容