Наверное проверять наличие портов и устройств на вашем роутере на телефоне та еще задача, особенно если у вас нет рут прав. Но это легко можно сделать с помощью моего нового бота. Достаточно ввести команду /scan и первые три цифры в конце точки вашего айпи адреса и он автоматически вышлет уведомлении лог-листа.

Функция сканирования портов, и словарь портов.

def scan_single_ip(ip):
    ports_to_scan = [21, 22, 23, 53, 80, 443, 445, 631, 8080]
    discovered_ports = []
    device_type = "Неизвестное устройство"

    for port in ports_to_scan:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(0.3)
        result = s.connect_ex((ip, port))
        if result == 0:
            discovered_ports.append(port)
            if port in PORT_GUESSER:
                device_type = PORT_GUESSER[port]
        s.close()

    if discovered_ports:
        return {
            "ip": ip,
            "ports": discovered_ports,
            "type": device_type
        }
    return None

async def run_network_scan(subnet):
    ip_list = [f"{subnet}{i}" for i in range(1, 255)]
    loop = asyncio.get_running_loop()
with ThreadPoolExecutor(max_workers=50) as executor:
    tasks = [loop.run_in_executor(executor, scan_single_ip, ip) for ip in ip_list]
    results = await asyncio.gather(*tasks)

return [r for r in results if r is not None]

А это исходный код бота кому интересно, делайте что хотите.

# -*- coding: utf-8 -*-
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from concurrent.futures import ThreadPoolExecutor
import threading
import socket
import requests

API_TOKEN = 'Ваш токен от ботфазер'

bot = Bot(token=API_TOKEN)
dp = Dispatcher()

PORT_GUESSER = {
    21: "FTP-сервер",
    22: "Линукс-девайс (SSH)",
    23: "Telnet-устройство",
    53: "DNS-сервер / Роутер",
    80: "Веб-интерфейс (Роутер/Камера)",
    443: "Защищенный веб (Роутер/ПК)",
    445: "Компьютер с Windows",
    631: "Сетевой Принтер",
    8080: "Прокси / Веб-сервер"
}

def scan_single_ip(ip):
    ports_to_scan = [21, 22, 23, 53, 80, 443, 445, 631, 8080]
    discovered_ports = []
    device_type = "Неизвестное устройство"

    for port in ports_to_scan:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(0.3)
        result = s.connect_ex((ip, port))
        if result == 0:
            discovered_ports.append(port)
            if port in PORT_GUESSER:
                device_type = PORT_GUESSER[port]
        s.close()

    if discovered_ports:
        return {
            "ip": ip,
            "ports": discovered_ports,
            "type": device_type
        }
    return None

async def run_network_scan(subnet):
    ip_list = [f"{subnet}{i}" for i in range(1, 255)]
    loop = asyncio.get_running_loop()
    
    with ThreadPoolExecutor(max_workers=50) as executor:
        tasks = [loop.run_in_executor(executor, scan_single_ip, ip) for ip in ip_list]
        results = await asyncio.gather(*tasks)
    
    return [r for r in results if r is not None]


@dp.message(Command("help"))
async def help_list(message: types.Message):
    await message.answer("channel - мой канал на хабре, scan [ваш айпи 3 цифры] - сканирование портов")

@dp.message(Command("start"))
async def send_welcome(message: types.Message):
    await message.answer("Бот Запущен! Сервер в рабочем состоянии! В случае если бот не будет отвечать, возможно мой ноутбук в выключенном состоянии.")

@dp.message(Command("channel"))
async def add_chanel(message: types.Message):
    await message.answer("Мой хабр: @dk_runkeevich")    

@dp.message(Command("scan"))
async def start_scan(message: types.Message):
    args = message.text.split()
    if len(args) < 2:
        await message.answer("Ошибка. Введите сеть, пример:\n/scan 192.168.1.")
        return

    subnet = args[1]
    await message.answer(f"Запускаю многопоточный сканер для {subnet}0/24...\nЭто займет около 10 секунд.")

    try:
        devices = await run_network_scan(subnet)
        
        if not devices:
            await message.answer("Сканирование завершено. Живых устройств с открытыми портами не найдено.")
            return

        report = f"? ОТЧЕТ О СКАН ИРОВАНИИ СЕТИ {subnet}0/24:\n\n"
        for dev in devices:
            report += f"? IP: {dev['ip']}\n"
            report += f"? Порты: {', '.join(map(str, dev['ports']))}\n"
            report += f"? Тип: {dev['type']}\n"
            report += "—" * 20 + "\n"

        await message.answer(report)

    except Exception as e:
        await message.answer(f"Произошла ошибка при сканировании: {e}")

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Если вы просто обычный пользователь а не кодер то вот ссылка на бота: https://t.me/dkrun_bot Извиняюсь что не выкладываю исходный код на гитхаб, это все потому что я не хочу пользователя заставлять нажать на какую то ссылку, зачем там если можно здесь?

p.p.s Мой бот не работает в 12 часов ночи. У меня не серверная а просто обычный ноут.

Комментарии (0)