Skip to content

Instantly share code, notes, and snippets.

@cobaltgit
Last active January 29, 2022 11:43
Show Gist options
  • Save cobaltgit/94d7c680f59dcddf37dab8c9b5888f8f to your computer and use it in GitHub Desktop.
Save cobaltgit/94d7c680f59dcddf37dab8c9b5888f8f to your computer and use it in GitHub Desktop.
Simple port scanner for Python 3.6+

Port Scanner

A simple port scanner program written in Python using the standard library

Usage

Scan all ports from 1 to 65535 on localhost

$ python portscan.py 

Scan all ports from 1 to 65535 on host google.com

$ python portscan.py -H google.com

Scan ports 80 and 443 on host httpbin.org

$ python portscan.py -H httpbin.org -p 80,443

Scan ports from 22-31337 on host scanme.nmap.org

$ python portscan.py -H scanme.nmap.org -p 22-31337

Scan port 25565 on host mc.hypixel.net

$ python portscan.py -H mc.hypixel.net -p 25565

Version Compatibility

This script is compatible with Python versions 3.6 and up
It has been tested working on 3.10.1

import argparse
import queue
import socket
import sys
import threading
socket.setdefaulttimeout(0.5)
parser = argparse.ArgumentParser(description="Scan a host for open ports.")
parser.add_argument(
"--host",
"-H",
dest="host",
type=str,
default="localhost",
help="Host to scan (defaults to localhost)",
)
parser.add_argument(
"--ports",
"-p",
dest="ports",
type=str,
default="1-65535",
help="Port range to scan (defaults to 1-65535, can use comma separated values)",
)
print_lock = threading.Lock()
args = parser.parse_args()
ip = socket.gethostbyname(args.host)
if "," in args.ports:
if args.ports.endswith(","):
args.ports = args.ports[:-1]
port_range = tuple(map(int, args.ports.split(",")))
else:
start = int(args.ports.split("-")[0])
try:
end = int(args.ports.split("-")[1])
except IndexError:
port_range = (start,)
else:
port_range = range(start, end + 1)
open_ports = []
if len(port_range) == 1:
print(
f"Cobalt Port Scanner - Starting scan on host {args.host} ({ip}) for port {int(args.ports.split('-')[0])}"
)
else:
print(
f"Cobalt Port Scanner - Starting scan on host {args.host} ({ip}) for ports {args.ports}"
)
def scan_ports(port: int):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((args.host, port))
except (socket.timeout, socket.error) as e:
return False
else:
try:
srv = socket.getservbyport(port, "tcp")
except socket.error:
with print_lock:
print(f"[*] {ip}:{port} is open")
else:
with print_lock:
print(f"[*] {ip}:{port} ({srv}) is open")
open_ports.append(port)
s.close()
def threader():
while 1:
worker = q.get()
scan_ports(worker)
q.task_done()
q = queue.Queue()
for _ in range(200):
t = threading.Thread(target=threader)
t.daemon = True
t.start()
for worker in port_range:
q.put(worker)
try:
q.join()
except KeyboardInterrupt:
print("\nScan interrupted!")
print(
f"Scan complete for host {args.host} ({ip})! Found {len(open_ports)} open port(s)"
)
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment