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








暂无评论内容