prathameshbodkhe29-ux/portscanner.py
GitHub: prathameshbodkhe29-ux/portscanner.py
一个基于 Python 多线程的 TCP 端口扫描器,支持 IPv4/IPv6,用于探测目标主机指定范围内端口的开放状态。
Stars: 0 | Forks: 0
# portscanner.py
这是一个基于 Python 的端口扫描器。它会扫描 1 到 1000 的端口,并显示其状态是开放还是关闭。
import socket
import threading
import queue
import logging
from datetime import datetime
# ==================================================
# 配置
# ==================================================
MAX_THREADS = 100
DEFAULT_TIMEOUT = 1.0
# ==================================================
# 日志设置
# ==================================================
logging.basicConfig(
filename="portscan.log",
level=logging.INFO,
format="%(asctime)s - %(message)s"
)
# ==================================================
# 共享资源
# ==================================================
port_queue = queue.Queue()
print_lock = threading.Lock()
# ==================================================
# 端口扫描函数
# ==================================================
def scan_port(host, port, timeout):
try:
# 自动检测 IPv4 或 IPv6
addr_info = socket.getaddrinfo(
host,
port,
socket.AF_UNSPEC,
socket.SOCK_STREAM
)
```
family, socktype, proto, canonname, sockaddr = addr_info[0]
sock = socket.socket(family, socktype, proto)
sock.settimeout(timeout)
result = sock.connect_ex(sockaddr)
if result == 0:
status = "OPEN"
else:
status = "CLOSED"
sock.close()
except socket.timeout:
status = "TIMEOUT"
except Exception as e:
status = f"ERROR ({e})"
with print_lock:
print(f"Port {port:<6} : {status}")
logging.info(f"{host}:{port} -> {status}")
```
# ==================================================
# 工作线程
# ==================================================
def worker(host, timeout):
while not port_queue.empty():
try:
port = port_queue.get_nowait()
scan_port(host, port, timeout)
port_queue.task_done()
except queue.Empty:
break
# ==================================================
# 扫描器函数
# ==================================================
def start_scan(host, start_port, end_port, timeout):
```
for port in range(start_port, end_port + 1):
port_queue.put(port)
threads = []
for _ in range(min(MAX_THREADS, end_port - start_port + 1)):
t = threading.Thread(
target=worker,
args=(host, timeout),
daemon=True
)
threads.append(t)
t.start()
for t in threads:
t.join()
```
# ==================================================
# 主程序
# ==================================================
def main():
```
print("=" * 50)
print("Python IPv4 / IPv6 TCP Port Scanner")
print("=" * 50)
host = input("Enter Host/IP (IPv4 or IPv6): ").strip()
try:
start_port = int(input("Start Port: "))
end_port = int(input("End Port: "))
if start_port < 1 or end_port > 65535:
raise ValueError
except ValueError:
print("Invalid port range.")
return
timeout_input = input(
f"Timeout in seconds [{DEFAULT_TIMEOUT}]: "
).strip()
timeout = DEFAULT_TIMEOUT
if timeout_input:
try:
timeout = float(timeout_input)
except ValueError:
pass
print("\nResolving host...")
try:
resolved = socket.getaddrinfo(
host,
None,
socket.AF_UNSPEC,
socket.SOCK_STREAM
)
ip_version = "IPv6" if resolved[0][0] == socket.AF_INET6 else "IPv4"
print(f"Target : {host}")
print(f"Detected: {ip_version}")
print(f"Ports : {start_port}-{end_port}")
print(f"Started : {datetime.now()}")
print("-" * 50)
except Exception as e:
print(f"Host resolution failed: {e}")
return
start_scan(host, start_port, end_port, timeout)
print("-" * 50)
print("Scan Complete.")
print("Results logged to portscan.log")
```
if __name__ == "__main__":
main()
标签:DNS查询工具, Python, 插件系统, 无后门, 端口扫描器, 网络工具, 逆向工具