RE/scan_port.py @@ -0,0 +1,55 @@ #!/usr/bin/env python3 import socket import argparse from concurrent.futures import ThreadPoolExecutor, as_completed from colorama import Fore, Style, init init(autoreset=True) COMMON_PORTS = [ 21,22,23,25,53,80,110,135,139,143,443,445, 3306,3389,5432,5900,8080,8443 ] def scan_port(host: str, port: int, timeout: float = 1.0) -> tuple[int, bool]: """Attempt to connect to a port; return (port, True/False).""" try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settimeout(timeout) result = sock.connect_ex((host, port)) return port, (result == 0) except Exception: return port, False def main(): parser = argparse.ArgumentParser(description="Simple Python3 Port Scanner") parser.add_argument("host", help="Target host/IP to scan") parser.add_argument("-s", "--start", type=int, default=1, help="Start port (default: 1)") parser.add_argument("-e", "--end", type=int, default=1024, help="End port (default: 1024)") parser.add_argument("-t", "--threads", type=int, default=100, help="Number of threads (default: 100)") parser.add_argument("--timeout", type=float, default=1.0, help="Socket timeout in seconds (default: 1.0)") parser.add_argument("--common", action="store_true", help="Scan only common ports instead of a range") args = parser.parse_args() host, start, end = args.host, args.start, args.end ports = COMMON_PORTS if args.common else list(range(start, end+1)) print(Fore.YELLOW + f"[*] Scanning {host} from port {ports[0]} to {ports[-1]}..." if not args.common else f"[*] Scanning {host} (common ports only)...") open_ports = [] with ThreadPoolExecutor(max_workers=args.threads) as executor: futures = [executor.submit(scan_port, host, port, args.timeout) for port in ports] for f in as_completed(futures): port, is_open = f.result() if is_open: print(Fore.GREEN + f"[+] Port {port} is OPEN") open_ports.append(port) if open_ports: print(Style.BRIGHT + Fore.GREEN + "\nOpen ports: " + ", ".join(map(str, sorted(open_ports)))) else: print(Style.BRIGHT + Fore.RED + "\nNo open ports found.") if __name__ == "__main__": main()