Проверить, открыт ли порт на Python

Проверка открытия порта на удаленном сервере — это распространенная задача, особенно в сетевом администрировании и разработке сетевых приложений. В Python это можно сделать с помощью библиотеки socket. В данной статье мы рассмотрим, как проверить, открыт ли порт на удаленном хосте, используя Python.

Основные концепции

  • Порт: Порт — это логическая конструкция, которая служит для идентификации определенного процесса или типа сетевого сервиса на сервере.
  • Хост: Хост — это компьютер или другое устройство, подключенное к сети.

Использование библиотеки socket

Python предоставляет библиотеку socket, которая позволяет работать с сокетами и выполнять сетевые операции. Мы будем использовать эту библиотеку для проверки состояния порта.

Пример скрипта

Давайте рассмотрим простой скрипт на Python, который проверяет, открыт ли порт на заданном хосте.

import socket, sys

ip = str(sys.argv[1]) if len(sys.argv) > 1 else ''
port = str(sys.argv[2]) if len(sys.argv) > 2 else ''

def scan_port(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #sock.settimeout(1)
    result = sock.connect_ex((str(host), int(port)))
    if result == 0:
        ok = True
    else:
        ok = False
    sock.close()
    return ok

if not ip:
    ip = socket.gethostbyname(socket.gethostname())

if port:
    if scan_port(ip, port):
        print(f'Порт "{port}" открыт!')
    else:
        print(f'Порт "{port}" закрыт.')
else:
    ports = {7:'echo',20:'FTP-data',21:'ftp',22:'ssh',23:'telnet',25:'smtp',43:'whois',53:'dns',68:'dhcp',69:'TFTP',80:'http',88:'Kerberos',102:'Iso-tsap',110:'pop3',115:'sftp',119:'nntp',123:'ntp',135:'Microsoft EPMAP',137:'NetBIOS-ns',139:'netbios',143:'imap',161:'snmp',179:'bgp',220:'imap3',381:'HP Openview',383:'HP Openview',389:'ldap',443:'https',464:'Kerberos',465:'SMTP over TLS/SSL, SSM',587:'SMTP',593:'Microsoft DCOM',636:'LDAP over TLS/SSL',691:'MS Exchange',902:'VMware Server',989:'FTP over SSL',990:'FTP over SSL',993:'imaps',995:'POP3 over SSL',1025:'Microsoft RPC',1194:'OpenVPN',1337:'WASTE',1589:'Cisco VQP',1723:'pptp',1725:'Steam',2049:'nfs',2082:'cPanel',2083:'radsec, cPanel',2483:'Oracle DB',2484:'Oracle DB',2967:'Symantec AV',3074:'XBOX Live',3306:'mysql',3389:'rdp',3724:'World of Warcraft',4664:'Google Desktop',5060:'sip',5432:'PostgreSQL',5900:'vnc',6665:'IRC',6881:'BitTorrent',6970:'Quicktime',6999:'BitTorrent',8080:'http-alt',8086:'Kaspersky AV',8087:'Kaspersky AV',8222:'VMware Server',9100:'PDL',10000:'BackupExec',12345:'NetBus',27374:'Sub7',31337:'Back Orifice'}
    for v in ports:
        port = v
        desc = ports[v]
        if scan_port(ip, port):
            print(f'Порт "{port} ({desc})" открыт!')
        else:
            print(f'Порт "{port} ({desc})" закрыт.')

Объяснение кода

  1. Импорт библиотеки: Мы импортируем библиотеку socket, которая предоставляет необходимые функции для работы с сокетами.
  2. Функция check_port:
    • Создаем сокет с параметрами AF_INET (семейство адресов IPv4) и SOCK_STREAM (тип сокета для TCP).
    • Устанавливаем таймаут на 1 секунду, чтобы скрипт не зависал при попытке соединения.
    • Используем метод connect_ex, который пытается установить соединение с указанным хостом и портом. Если соединение успешно, метод возвращает 0, иначе — код ошибки.
    • Возвращаем True, если порт открыт, и False, если закрыт.
  3. Пример использования:
    • Устанавливаем переменные host и port на целевые значения.
    • Вызываем функцию check_port и выводим результат.

Пример запуск скрипта:

py portChecker.py
py portChecker.py 192.168.0.128 80

Заключение

Использование Python для проверки открытия порта — это мощный и гибкий подход, который может быть адаптирован под различные задачи. Основные преимущества включают простоту использования, возможность масштабирования и интеграцию с другими системами.
Поделится:
*текст* - жирный, ~текст~ - курсивный, -текст- - зачеркнутый, _текст_ - подчеркнутый
IP-адрес: 3.128.200.110
Часовой пояс: Asia/Almaty
Подробнее

Сервисы

Страницы

Информация