Каким образом можно проверить, доступны ли IP-адреса и порты, указанные в текстовом файле?

Как можно периодически проверять доступность IP-адресов с портами из текстового файла с помощью модуля "socket", а затем создавать новый файл, содержащий только активные IP-адреса с портами? Поясните, как очистить предыдущие данные в файлах ip.txt и ipUP.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
```

Также приведены примеры кода для проверки доступности и обработки данных:
```python
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))
```

```python
import re

with open('traffic.txt', 'r') as file:
    fi = file.readlines()
re_ip = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
re_port = re.compile(r"^\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)
```
  • 21 ноября 2024 г. 8:33
Ответы на вопрос 2
Для проверки доступности IP-адресов и портов, указанных в текстовом файле, и создания нового файла с активными адресами, вы можете следовать следующему алгоритму:

1. Чтение IP-адресов и портов из файла.
2. Проверка доступности каждого IP-адреса и порта с помощью функции `socket.connect_ex()`.
3. Сохранение активных адресов в новый файл.
4. Очистка содержимого предыдущих файлов перед записью новых данных.

Вот более полная версия кода, которая иллюстрирует этот процесс:

```python
import socket
import re
import time

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

# Функция для чтения IP-адресов и портов из файла
def read_ip_ports(file_path):
    with open(file_path, 'r') as file:
        lines = file.readlines()
        
    ip_ports = []
    for line in lines:
        match = re.search(r'(\d{1,3}(?:\.\d{1,3}){3}):(\d+)', line)
        if match:
            ip = match.group(1)
            port = int(match.group(2))
            ip_ports.append((ip, port))
    return ip_ports

# Функция для записи активных IP-адресов в файл
def write_active_ip_ports(file_path, active_ips):
    with open(file_path, 'w') as file:
        for ip, port in active_ips:
            file.write(f"{ip}:{port}\n")

# Главная функция
def main():
    input_file = 'ip.txt'
    output_file = 'ipUP.txt'
    
    # Очистка предыдущих данных в файлах
    open(input_file, 'w').close()
    open(output_file, 'w').close()

    # Заполнение тестового файла (добавьте свои адреса)
    with open(input_file, 'w') as file:
        file.write("178.237.187.66:53389\n")
        file.write("82.116.48.210:50000\n")
        file.write("213.184.149.46:60000\n")
        file.write("109.74.133.46:4455\n")
        file.write("78.110.245.206:3398\n")
        file.write("89.109.52.230:1001\n")
        file.write("88.135.48.69:3398\n")

    while True:
        active_ips = []
        ip_ports = read_ip_ports(input_file)

        for ip, port in ip_ports:
            if check_ip_port(ip, port):
                active_ips.append((ip, port))

        write_active_ip_ports(output_file, active_ips)
        print(f"Проверка завершена. Активные IP-адреса и порты записаны в {output_file}.")
        
        # Пауза перед следующей проверкой (например, 60 секунд)
        time.sleep(60)

if __name__ == "__main__":
    main()
```

### Описание кода:

- **Функция `check_ip_port`**: проверяет, доступен ли указанный IP-адрес и порт. Если соединение успешно (т.е. порт открыт), возвращает `True`, иначе - `False`.

- **Функция `read_ip_ports`**: считывает пары IP-адресов и портов из указанного файла с помощью регулярных выражений.

- **Функция `write_active_ip_ports`**: записывает активные IP-адреса с портами в выходной файл.

- **Основная функция `main`**: 
  - Очищает содержимое файлов `ip.txt` и `ipUP.txt`.
  - Заполняет файл `ip.txt` тестовыми значениями (можно заменить на ваши адреса).
  - Запускает бесконечный цикл, в котором происходит проверка IP-адресов и их портов с записью активных в файл `ipUP.txt`.
  - В конце каждого цикла идет пауза в 60 секунд (измените на нужное вам время).

Этот код можно сохранить в файл (например, `check_ip_ports.py`) и запустить. Убедитесь, что вы запускаете его с правами, позволяющими устанавливать соединения.
Обязательно на 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
Похожие вопросы