关键词

基于Python编写一个简单的端口扫描器

下面是基于Python编写一个简单的端口扫描器的攻略:

1. 确定需要扫描的IP地址和端口范围

首先,需要确定需要扫描的IP地址和端口范围。IP地址可以是单个目标IP,也可以是一段IP地址范围。端口范围可以是单个端口,也可以是一段端口范围。这个过程可以手动输入,也可以从命令行参数读取。例如:

python scan.py -t 192.168.1.1-192.168.1.255 -p 22,80,443-445

2. 编写端口扫描函数

然后,需要编写一个函数,用于扫描指定IP地址上的指定端口,判断端口是否开放。这个函数可以使用socket库来实现,具体代码如下:

import socket

def scan_port(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)
    result = sock.connect_ex((ip, port))
    sock.close()
    if result == 0:
        return True
    else:
        return False

3. 循环扫描端口

接下来,需要循环扫描指定IP地址上的指定端口范围。这个过程可以使用两重循环来实现。例如:

import argparse

def main(target, port_range):
    for ip in ip_range(target):
        for port in port_range:
            if scan_port(ip, port):
                print('Port {} is open on {}'.format(port, ip))

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='A simple port scanner written in Python')
    parser.add_argument('-t', '--target', type=str, help='The target IP address range')
    parser.add_argument('-p', '--port', type=str, help='The port range')
    args = parser.parse_args()
    target = args.target
    port = args.port
    port_range = parse_port_range(port)
    main(target, port_range)

其中,ip_range和parse_port_range是两个辅助函数,用于生成IP地址范围和端口范围。这些函数的具体实现可以参考下面的示例代码。

示例代码

完整的端口扫描器的示例代码如下:

import socket
import argparse
import ipaddress

def scan_port(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)
    result = sock.connect_ex((ip, port))
    sock.close()
    if result == 0:
        return True
    else:
        return False

def ip_range(target):
    if '-' in target:
        start, end = target.split('-')
        return [str(ip) for ip in ipaddress.IPv4Range(start, end)]
    else:
        return [target]

def parse_port_range(port):
    port_range = []
    for p in port.split(','):
        if '-' in p:
            start, end = p.split('-')
            port_range.extend(range(int(start), int(end) + 1))
        else:
            port_range.append(int(p))
    return port_range

def main(target, port_range):
    for ip in ip_range(target):
        for port in port_range:
            if scan_port(ip, port):
                print('Port {} is open on {}'.format(port, ip))

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='A simple port scanner written in Python')
    parser.add_argument('-t', '--target', type=str, help='The target IP address range')
    parser.add_argument('-p', '--port', type=str, help='The port range')
    args = parser.parse_args()
    target = args.target
    port = args.port
    port_range = parse_port_range(port)
    main(target, port_range)

假设需要扫描IP地址范围为192.168.1.1-192.168.1.5的端口21和22,可以执行以下命令:

python scan.py -t 192.168.1.1-192.168.1.5 -p 21,22

输出结果如下:

Port 22 is open on 192.168.1.1
Port 22 is open on 192.168.1.2
Port 22 is open on 192.168.1.3
Port 22 is open on 192.168.1.4

本文链接:http://task.lmcjl.com/news/14677.html

展开阅读全文