Задать вопрос
@Zhazira_N

Как проверить доступность списка IP:Port из txt-файла?

Есть текстовый файл со следующим списком:

178.237.187.66:53389
82.116.48.210:50000
213.184.149.46:60000
109.74.133.46:4455
78.110.245.206:3398
89.109.52.230:1001
88.135.48.69:3398


Как периодически проверять доступность IP:port через "socket" и создавать новый файл со списком доступных IP:port?

То есть 2 файла:
1) ip.txt со списком всех адресов
и
2) ipUP.txt со списком только активных адресов, с очисткой предыдущих значений.

import socket
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(2)                                      #2 Second Timeout
    result = sock.connect_ex(('127.0.0.1',80))
    if result == 0:
      print 'port OPEN'
    else:
      print 'port CLOSED, connect_ex returned: '+str(result)


import re
    
    with open('traffic.txt', 'r') as file:
        fi = file.readlines()
    re_ip = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
    re_port = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$\:(\d+)")
    
    for line in fi:
        ip = re.findall(re_ip,line)
        port = re.findall(re_port,line)
        print port , ip


Возможно плохо искала, но всё что нашла в интернете по поиску.
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
@rPman
Обязательно на python?

с помощью nmap можно проверить работает или нет, а с помощью parallel можно запускать одновременно несколько проверок (в данном пример он будет пытаться держать запущенными 10 nmap, по завершении одного, будет брать следующий ip:port и запускать новый экземпляр)
parallel -j10 --colsep ':' '
    nmap_result=$(nmap -p {2} {1} | grep "open")
    if [ -n "$nmap_result" ]; then
        echo "{1}:{2} - OPEN" >> results.log
    else
        echo "{1}:{2} - CLOSED" >> results.log
    fi
' < servers.txt
Ответ написан
Комментировать
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
С помощью psping: https://learn.microsoft.com/en-us/sysinternals/dow... By Mark Russinovich.
import subprocess


# Функция для проверки доступности IP:port с помощью psping
def check_ip(ip_port):
    try:
        print(f"Проверяем доступность {ip_port}", end='')
        # Выполняем команду psping
        result = subprocess.run(['psping', ip_port], capture_output=True, text=True)
        # Проверяем, есть ли в выводе сообщение об успешном пинге
        if "(0% loss)" in result.stdout:
            print(f"\rПроверяем доступность {ip_port} - доступен")
            return True
        if "(25% loss)" in result.stderr or "50% loss" in result.stdout:
            print(f"\rПроверяем доступность {ip_port} - потери пакетов")
            return True
        if "(100% loss)" in result.stdout:
            print(f"\rПроверяем доступность {ip_port} - недоступен")
            return False
    except Exception as e:
        print(f"Ошибка при проверке {ip_port}: {e}")
    return False


# Чтение IP:port из файла и запись доступных в другой файл
def check_ips_from_file(input_file, output_file):
    with open(input_file, 'r') as infile, open(output_file, 'w') as outfile:
        for line in infile:
            ip_port = line.strip()  # Убираем лишние пробелы и символы новой строки
            if check_ip(ip_port):
                outfile.write(ip_port + '\n')  # Записываем доступный IP:port в файл


# Указываем имена файлов
input_file = 'ip.txt'
output_file = 'ipUP.txt'

# Запускаем проверку
check_ips_from_file(input_file, output_file)
Ответ написан
Lord_of_Rings
@Lord_of_Rings
Северный странник. Злой, но добрый
import socket
import re
import subprocess
import platform

# Функция для проверки доступности IP
def is_ip_reachable(ip):
    # Параметры для команды ping в зависимости от операционной системы
    param = '-n' if platform.system().lower() == 'windows' else '-c'
    command = ['ping', param, '1', ip]
    return subprocess.call(command) == 0

# Функция для проверки доступности IP:port
def check_ip_port(ip, port):
    if not is_ip_reachable(ip):
        return False
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(2)  # 2 секунды таймаут
    result = sock.connect_ex((ip, port))
    sock.close()
    return result == 0

# Чтение списка IP:port из файла
with open('ip.txt', 'r') as file:
    lines = file.readlines()

# Регулярные выражения для извлечения IP и порта
re_ip_port = re.compile(r"^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)$")

# Список для хранения доступных IP:port
available_ips = []

# Проверка каждого IP:port
for line in lines:
    match = re_ip_port.match(line.strip())
    if match:
        ip, port = match.groups()
        port = int(port)
        if check_ip_port(ip, port):
            available_ips.append(f"{ip}:{port}")

# Запись доступных IP:port в новый файл
with open('ipUP.txt', 'w') as file:
    for ip_port in available_ips:
        file.write(ip_port + '\n')

print("Проверка завершена. Доступные IP:port записаны в файл ipUP.txt")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы