Pengimbas Pelabuhan Asas menggunakan Python

Linda Hamilton
Lepaskan: 2024-10-23 13:31:30
asal
156 orang telah melayarinya

Basic Port Scanner using Python

Kod sumber klik di sini

Ini ialah alat Pengimbas Pelabuhan asas yang membolehkan pengguna mengimbas hos untuk mencari port terbuka dan perkhidmatan yang dijalankan pada port...

Mula-mula mari kita lihat kod itu dan kemudian, pecahkan kepada beberapa bahagian untuk menganalisisnya...

import socket
from datetime import datetime
import sys
import os 

def usage():
    """Prints the usage information for this script."""
    usage_info = """
    Tool Name: SimplePortScanner 

    Developed by : Bharath Kumar

    Usage:
        python3 port_scanner.py [options]

    Options:
        -h, --help           Show this help message and exit.
        -t, --target <ip>    Specify the target hostname or IP address (required).
        -p, --port <port>    Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024).

    Description:
        This script performs a port scan on a specified hostname or IP address
        for a specific port or a range of ports, checking which ports are open. 

    Examples:
        python3 port_scanner.py -t example.com (or) 192.0.0.1 
        python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80
        python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024
    """
    print(usage_info)

start_time = datetime.now()

def scan_port(ip, port):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        result = s.connect_ex((ip, port))
        service = socket.getservbyport(int(port))
    except:
        service = "None"
    if result == 0:
        print(" Port: {}\t State: Open\t Service: {}".format(port, service))

    else:
        pass

    s.close()


def host(target):
    try:
        ip = socket.gethostbyname(target)
        print('_'*51)
        print("[#] Resolved {} to {}".format(target,ip))
        return ip
    except:
        print('_'*51)
        print("[#] Error: Unable to resolve hostname {}".format(target))
        sys.exit(1)

def check_host_up(ip):

    ping = os.system("ping {} -c 1 > /dev/null".format(ip))

    if ping == 0:
       print("[#] {} host is up and running".format(ip))
       return True
    else:
        print("[#] {} host is down".format(ip))
        print("Exiting...")
        exit()
        return False





if __name__ == "__main__":

    target_ip = None
    start_port = 1
    end_port = 65535

    try:
        for i, arg in enumerate(sys.argv):
            if arg in ("-t", "--target"):
                target_ip = sys.argv[i + 1]
            elif arg in ("-p", "--ports"):
                port_range = sys.argv[i + 1]
                if "-" in port_range:
                    start_port, end_port = map(int, port_range.split('-'))
                else:
                    start_port = end_port = int(port_range)

        if target_ip is None:
            print("[#] Error: Target hostname or IP address is required.")
            usage()
            sys.exit(1)

        if start_port is None or end_port is None:
            print("[#] Error: Port range is required.")
            usage()
            sys.exit(1)

        target_ip = host(target_ip)

        if not check_host_up(target_ip):
            sys.exit(1)

        print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...")
        print("[#] Scanning started at: {}".format(start_time))
        print('_'*51)

        for port in range(start_port, end_port + 1):
            scan_port(target_ip, port)

    except (IndexError, ValueError):
        print("[#] Error: Invalid arguments provided.")
        usage()
        sys.exit(1)

start_time = start_time.now() - start_time
print('_'*51)
print("Scanning is completed in ",start_time)

Salin selepas log masuk
Salin selepas log masuk

Import soket: Cara dua nod(pelayan,pelanggan) untuk bercakap antara satu sama lain.

dari tarikh import datetime: Digunakan mengira masa yang dihabiskan untuk mengimbas.

Sis import: ialah akses kepada parameter khusus sistem(argv).

Os import: digunakan untuk melaksanakan ping arahan.

def_usage(): Mencetak maklumat penggunaan untuk skrip ini.

start_time = datetime.now(): digunakan untuk mendapatkan masa dan tarikh semasa untuk mengira masa yang dibelanjakan untuk mengimbas.

def scan_port(ip, port):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        result = s.connect_ex((ip, port))
        service = socket.getservbyport(int(port))
    except:
        service = "None"
    if result == 0:
        print(" Port: {}\t State: Open\t Service: {}".format(port, service))

    else:
        pass

    s.close()


Salin selepas log masuk
Salin selepas log masuk

Blok kod ini mentakrifkan fungsi scan_port(ip, port) yang menyemak sama ada port tertentu pada addr ip tertentu dibuka menggunakan soket.

Penciptaan soket: socket.socket(socket.AF_INET, socket.SOCK_STREAM) Cipta soket baharu untuk IPv4 menggunakan TCP.

Tamat masa: s.settimeout(1) tetapkan masa soket kepada 1 saat, jika sambungan tidak berjaya dalam masa itu, ia akan berhenti mencuba.

Ujian sambungan:s.connect_ex((ip, port))ia cuba menyambungkan ip dan port tertentu. jika ia berjaya, keputusan akan menjadi 0; jika tidak, ia akan menjadi nilai yang berbeza.

Pengesanan perkhidmatan: socket.getservbyport(int(port))cuba untuk mengesan perkhidmatan yang dijalankan pada port yang ditentukan.seperti HTTP untuk port 80.

Pengendalian Ralat: Sekiranya berlaku ralat (cth., tiada perkhidmatan pada port), blok kecuali menetapkan perkhidmatan kepada "Tiada".

Output: Jika port dibuka (hasil == 0), ia mencetak nombor port, nyatakan ("Buka") dan nama perkhidmatan.

Penutupan Sambungan: s.close() menutup soket untuk mengosongkan sumber.

def host(target):
    try:
        ip = socket.gethostbyname(target)
        print('_'*51)
        print("[#] Resolved {} to {}".format(target,ip))
        return ip
    except:
        print('_'*51)
        print("[#] Error: Unable to resolve hostname {}".format(target))
        sys.exit(1)
Salin selepas log masuk

Blok kod ini mentakrifkan hos fungsi (sasaran) yang menyelesaikan sasaran tertentu (nama hos) ke alamat ip yang sepadan menggunakan socket.gethostname()

def check_host_up(ip):

    ping = os.system("ping {} -c 1 > /dev/null".format(ip))

    if ping == 0:
       print("[#] {} host is up and running".format(ip))
       return True
    else:
        print("[#] {} host is down".format(ip))
        print("Exiting...")
        exit()
        return False
Salin selepas log masuk

Fungsi check_host_up(ip) ini yang menyemak sama ada port tertentu pada ip sasaran tertentu adalah atas atau bawah menggunakan kaedah ping os.system() untuk mengenal pasti .

if __name__ == "__main__":

    target_ip = None
    start_port = 1
    end_port = 65535

    try:
        for i, arg in enumerate(sys.argv):
            if arg in ("-t", "--target"):
                target_ip = sys.argv[i + 1]
            elif arg in ("-p", "--ports"):
                port_range = sys.argv[i + 1]
                if "-" in port_range:
                    start_port, end_port = map(int, port_range.split('-'))
                else:
                    start_port = end_port = int(port_range)


Salin selepas log masuk

Penghuraian Hujah Baris Perintah

Tatasusunan sys.argv mengandungi senarai argumen yang dihantar ke skrip. Kami mengulangi hujah ini untuk menyemak IP sasaran (-t atau --target) dan julat port (-p atau --ports).

IP sasaran/nama hos disimpan dalam target_ip.
Julat port dihuraikan dan dibahagikan kepada start_port dan end_port. Jika tiada julat ditentukan, ia lalai untuk mengimbas semua port dari 1 hingga 65535.

import socket
from datetime import datetime
import sys
import os 

def usage():
    """Prints the usage information for this script."""
    usage_info = """
    Tool Name: SimplePortScanner 

    Developed by : Bharath Kumar

    Usage:
        python3 port_scanner.py [options]

    Options:
        -h, --help           Show this help message and exit.
        -t, --target <ip>    Specify the target hostname or IP address (required).
        -p, --port <port>    Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024).

    Description:
        This script performs a port scan on a specified hostname or IP address
        for a specific port or a range of ports, checking which ports are open. 

    Examples:
        python3 port_scanner.py -t example.com (or) 192.0.0.1 
        python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80
        python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024
    """
    print(usage_info)

start_time = datetime.now()

def scan_port(ip, port):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        result = s.connect_ex((ip, port))
        service = socket.getservbyport(int(port))
    except:
        service = "None"
    if result == 0:
        print(" Port: {}\t State: Open\t Service: {}".format(port, service))

    else:
        pass

    s.close()


def host(target):
    try:
        ip = socket.gethostbyname(target)
        print('_'*51)
        print("[#] Resolved {} to {}".format(target,ip))
        return ip
    except:
        print('_'*51)
        print("[#] Error: Unable to resolve hostname {}".format(target))
        sys.exit(1)

def check_host_up(ip):

    ping = os.system("ping {} -c 1 > /dev/null".format(ip))

    if ping == 0:
       print("[#] {} host is up and running".format(ip))
       return True
    else:
        print("[#] {} host is down".format(ip))
        print("Exiting...")
        exit()
        return False





if __name__ == "__main__":

    target_ip = None
    start_port = 1
    end_port = 65535

    try:
        for i, arg in enumerate(sys.argv):
            if arg in ("-t", "--target"):
                target_ip = sys.argv[i + 1]
            elif arg in ("-p", "--ports"):
                port_range = sys.argv[i + 1]
                if "-" in port_range:
                    start_port, end_port = map(int, port_range.split('-'))
                else:
                    start_port = end_port = int(port_range)

        if target_ip is None:
            print("[#] Error: Target hostname or IP address is required.")
            usage()
            sys.exit(1)

        if start_port is None or end_port is None:
            print("[#] Error: Port range is required.")
            usage()
            sys.exit(1)

        target_ip = host(target_ip)

        if not check_host_up(target_ip):
            sys.exit(1)

        print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...")
        print("[#] Scanning started at: {}".format(start_time))
        print('_'*51)

        for port in range(start_port, end_port + 1):
            scan_port(target_ip, port)

    except (IndexError, ValueError):
        print("[#] Error: Invalid arguments provided.")
        usage()
        sys.exit(1)

start_time = start_time.now() - start_time
print('_'*51)
print("Scanning is completed in ",start_time)

Salin selepas log masuk
Salin selepas log masuk

Resolusi Hos dan Kebolehcapaian

Setelah kami mempunyai alamat IP yang sah, kami perlu menyemak sama ada hos boleh dihubungi. Hos fungsi(target_ip) menyelesaikan nama hos kepada alamat IPnya dan check_host_up(target_ip) mengesahkan sama ada hos berada dalam talian.

def scan_port(ip, port):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        result = s.connect_ex((ip, port))
        service = socket.getservbyport(int(port))
    except:
        service = "None"
    if result == 0:
        print(" Port: {}\t State: Open\t Service: {}".format(port, service))

    else:
        pass

    s.close()


Salin selepas log masuk
Salin selepas log masuk

Pengimbasan port

Inti kefungsian pengimbasan port berlaku di dalam gelung:

Gelung ini berulang melalui julat port yang ditentukan, dan untuk setiap port, fungsi scan_port(target_ip, port) menyiasat port untuk memeriksa sama ada ia dibuka atau ditutup.

Kesimpulan

Dengan mengikuti panduan ini, anda telah mempelajari cara membina pengimbas port Python ringkas yang menerima hujah baris arahan, mengesahkan input dan mengimbas julat port pada sasaran tertentu. Walaupun ini merupakan pelaksanaan asas, ia meletakkan asas untuk ciri yang lebih maju seperti pengesanan benang atau perkhidmatan.

Jangan ragu untuk menyesuaikan dan mengembangkan skrip ini untuk memenuhi keperluan khusus anda. Selamat mengimbas!

Atas ialah kandungan terperinci Pengimbas Pelabuhan Asas menggunakan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!