Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Скрипт для отображения клиентов в WLAN (с именем хоста и точкой доступа)

    Скрипт для отображения клиентов в WLAN (с именем хоста и точкой доступа)

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Скрипт для отображения клиентов в WLAN (с именем хоста и точкой доступа), RouterOS
     
    Bernhard
    Guest
    #1
    0
    04.10.2021 12:47:00
    Всем привет! В CAPsMAN можно вывести список всех зарегистрированных клиентов на всех CAP интерфейсах. Видны MAC-адрес клиента и интерфейс. Но то, чего не видно — это DHCP-имя клиента и к какой точке доступа он подключён. Я написал скрипт, который выводит именно эту информацию. Вот что вы получите:

    MAC                IP               Клиент      Точка доступа  Сигнал  TX скорость  RX скорость  Время работы  Байт              Пакетов            Интерфейс  
    FF:FF:FF:11:3E:9C  192.168.12.251   Client01    AccessPoint01  -53     117Mbps      12Mbps      5d01:54:54    68431014,22847922  286257,200633       cap14  
    FF:FF:FF:11:76:9A  192.168.12.250   Client02    AccessPoint03  -75     16Mbps       12Mbps      1d10:54:53    68123014,54347922  286257,200633       cap12  

    Вот мой скрипт:

    :global fill do={
    # эта функция заполняет строку символом до заданной длины — чтобы сделать табличный вывод значений
    # 3 параметра: #1 строка для заполнения
    #               #2 длина, до которой заполняется (или обрезается)
    #               #3 символ для заполнения (или разделитель, если обрезаем)
    # если длина строки больше или равна длине параметра минус 1, строка обрезается до length-1 и в конце добавляется символ-разделитель
    :local STR $1;
    :local LEN $2;
    :local CHAR $3;
    :if ([:len $STR] >= $LEN) do={
    # строка обрезается
    :set STR ([:pick $STR 0 ($LEN-1)].$CHAR);
    } else {
    # строка дополняется до длины
    :for i from=1 to=($LEN-[:len $STR]) step=1 do={
    :set STR ("$STR" . $CHAR);
    }
    }
    :return $STR;
    }

    :put ([$fill "MAC" 19 " "].[$fill "IP" 17 " "].[$fill "Client" 12 " "].[$fill "AP" 16 " "].[$fill "Signal" 7 " "].[$fill "TX Rate" 11 " "].[$fill "RX Rate" 11 " "].[$fill "Uptime" 14 " "].[$fill "Bytes" 20 " "].[$fill "Packets" 20 " "]."Interface");
    :foreach i in=[/caps-man registration-table find .id] do={
    :local locMAC    [/caps-man registration-table get $i mac-address];
    :local locInt    [/caps-man registration-table get $i interface];
    :local locSignal [/caps-man registration-table get $i rx-signal];
    :local loctxRate [/caps-man registration-table get $i tx-rate];
    # сокращаем до значимого: "173.3Mbps-20MHz/2S/SGI" --> "173.3Mbps"
    :if ([:find $loctxRate "-" -1] > 0) do={ :set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]];}
    :local locrxRate [/caps-man registration-table get $i rx-rate];
    :if ([:find $locrxRate "-" -1] > 0) do={ :set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]];}
    :local locUptime [/caps-man registration-table get $i uptime];
    :set locUptime   [:pick $locUptime 0 [:find $locUptime "." -1]];
    :local locBytes  [/caps-man registration-table get $i bytes];
    :local locPack   [/caps-man registration-table get $i packets];
    :local locRadMAC [/caps-man interface get [/caps-man interface find name=$locInt] radio-mac];
    :local locCAP    [/caps-man radio get [/caps-man radio find radio-mac=$locRadMAC] remote-cap-identity];
    :local locIP     [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] address];
    :local locName   [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] host-name];
    :put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 16 " "].[$fill $locSignal 7 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 20 " "].[$fill $locPack 20 " "]."$locInt");
    }

    С уважением,  
    Bernhard
     
     
     
    Bernhard
    Guest
    #2
    0
    03.03.2022 14:35:00
    Привет! Я обновил свой скрипт, теперь он умеет показывать SSID и клиентов на Slave-интерфейсах. Если сигнал ниже -70дБ, строка выводится красным. Также поймал несколько ошибок, которые раньше останавливали скрипт. Вот как это сейчас выглядит:

    MAC                IP               Client      AP              Signal SSID               TX Rate    RX Rate    Uptime        Bytes               Packets             Interface  
    98:3B:8F:8B:27:E3  10.22.32.208     Client01    AP01_Floor1     -55    WLAN_Office        173.3Mbps  173.3Mbps  3d08:14:50    2079611693,36712726 5218249,3579269     cap56  
    E6:B0:C2:D6:D5:73  10.22.32.218     Client05    AP06_Floor4     -68    WLAN_Guest         173.3Mbps  78Mbps     2d03:50:14    15286043,30608002   46680,45932         cap68  

    Вот сам скрипт:  
    # Скрипт wlan - выводит список WLAN-клиентов с DHCP-именами и уровнем сигнала, собранных из 4 таблиц (caps-man registration-table, caps-man interface, caps-man radio, ip dhcp-server lease)  
    # v1.0 BV 2021-10-01 - первая версия  
    # v2.0 BV 2021-12-02 - при сигнале равном или ниже -70дБ строка выводится красным (плохой сигнал)  
    # v2.1 BV 2022-03-03 - исправлена ошибка со Slave-интерфейсами (надо смотреть Radio MAC главного интерфейса); добавлен SSID  

    :global fill do={  
       # Эта функция заполняет строку символами до нужной длины — используется для табличного вывода  
       # 3 параметра:  
       #    #1 строка для заполнения  
       #    #2 длина, до которой нужно заполнить (или обрезать)  
       #    #3 символ для заполнения (или в качестве разделителя при обрезке)  
       # Если длина строки больше или равна параметру длины, строка обрезается до длины минус один, и добавляется символ-разделитель  
       :local STR $1;  
       :local LEN $2;  
       :local CHAR $3;  
       :if ([:len $STR] >= $LEN) do={
           # строка обрезается  
           :set STR ([:pick $STR 0 ($LEN-1)].$CHAR);
       } else {  
           # заполняем строку до нужной длины  
           :for i from=1 to=($LEN-[:len $STR]) step=1 do={
               :set STR ("$STR" . $CHAR);  
           }  
       }  
       :return $STR;  
    }  

    :put ([$fill "MAC" 19 " "].[$fill "IP" 17 " "].[$fill "Client" 12 " "].[$fill "AP" 16 " "].[$fill "Signal" 7 " "].[$fill "SSID" 19 " "].[$fill "TX Rate" 11 " "].[$fill "RX Rate" 11 " "].[$fill "Uptime" 14 " "].[$fill "Bytes" 20 " "].[$fill "Packets" 20 " "]."Interface");
    :foreach i in=[/caps-man registration-table find .id] do={
       :local locMAC    [/caps-man registration-table get $i mac-address];
       :local locInt    [/caps-man registration-table get $i interface];
       :local locSSID   [/caps-man registration-table get $i ssid];
       :local locSignal [/caps-man registration-table get $i rx-signal];
       :local loctxRate [/caps-man registration-table get $i tx-rate];
       # сокращаем до нужных данных: "173.3Mbps-20MHz/2S/SGI" --> "173.3Mbps"  
       :if ([:find $loctxRate "-" -1] > 0) do={ :set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]];}
       :local locrxRate [/caps-man registration-table get $i rx-rate];
       :if ([:find $locrxRate "-" -1] > 0) do={ :set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]];}
       :local locUptime [/caps-man registration-table get $i uptime];
       :set locUptime    [:pick $locUptime 0 [:find $locUptime "." -1]];
       :local locBytes  [/caps-man registration-table get $i bytes];
       :local locPack    [/caps-man registration-table get $i packets];
       # если это Slave-интерфейс, нужно взять Radio MAC главного интерфейса  
       :local locMasterInt [/caps-man interface get [/caps-man interface find name=$locInt] master-interface];
       :local locRadioMAC;  
       :if ($locMasterInt = "none") do={set locRadioMAC [/caps-man interface get [/caps-man interface find name=$locInt] radio-mac]} else={set locRadioMAC [/caps-man interface get [/caps-man interface find name=$locMasterInt] radio-mac]}
       :local locCAP;  
       :do {set $locCAP  [/caps-man radio get [/caps-man radio find radio-mac=$locRadioMAC] remote-cap-identity]} on-error={:put ("ERROR - ".$locMAC." - ".$locCAPMAC)};
       # получаем IP и имя из DHCP-сервера (если есть)  
       :local locIP;  
       :local locName;  
       :if ([/ip dhcp-server lease find mac-address=$locMAC]) do={
           set $locIP      [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] address];
           set $locName    [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] host-name];
       } else={  
           set $locIP "noIP";  
           set $locName "noName";  
       }  
       :if ($locSignal <= -70) do={  
           # плохой сигнал — выводим строку красным  
           :terminal style varname;  
           :put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 16 " "].[$fill $locSignal 7 " "].[$fill $locSSID 19 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 20 " "].[$fill $locPack 20 " "]."$locInt");
           :terminal style none;  
       } else={  
           :put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 16 " "].[$fill $locSignal 7 " "].[$fill $locSSID 19 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 20 " "].[$fill $locPack 20 " "]."$locInt");
       }  
    }
     
     
     
    Bernhard
    Guest
    #3
    0
    13.02.2023 13:33:00
    Привет! Я обновил скрипт, чтобы он ловил ошибки с дублирующимися записями DHCP.  
    # Скрипт wlan — выводит список WLAN-клиентов с DHCP-именами и уровнем сигнала, собранным из 4 таблиц (caps-man registration-table, caps-man interface, caps-man radio, ip dhcp-server lease)  
    # v1.0 BV 2021-10-01 — первая версия  
    # v2.0 BV 2021-12-02 — если сигнал равен или меньше -70дБ, строка выводится красным (плохой сигнал)  
    # v2.1 BV 2022-03-03 — исправлена ошибка со Slave интерфейсами (надо смотреть Radio MAC главного интерфейса); добавлен SSID  
    # v2.2 BV 2022-03-28 — исправлена ошибка с дублирующимися записями в DHCP  
    # v2.3 BV 2022-12-13 — подгонка ширины колонок (AP, SSID, Bytes, Packets)

    :global fill do={  
       # эта функция дополняет строку символом до нужной длины — используется для табличного вида данных  
       # 3 параметра:  
       #    #1 строка для заполнения  
       #    #2 длина, до которой надо дополнить (или обрезать)  
       #    #3 символ для заполнения (или разделитель при обрезке)  
       # если длина строки больше или равна length-1, строка обрезается до length-1 и к ней добавляется 1 символ-разделитель  
       :local STR $1;  
       :local LEN $2;  
       :local CHAR $3;  
       :if ([:len $STR] >= $LEN) do={
           # строку надо обрезать  
           :set STR ([:pick $STR 0 ($LEN-1)].$CHAR);
       } else {  
           # строку надо дополнить до нужной длины  
           :for i from=1 to=($LEN-[:len $STR]) step=1 do={
               :set STR ("$STR" . $CHAR);  
           }  
       }  
       :return $STR;  
    }  
    :put ([$fill "MAC" 19 " "].[$fill "IP" 17 " "].[$fill "Client" 12 " "].[$fill "AP" 10 " "].[$fill "Signal" 7 " "].[$fill "SSID" 18 " "].[$fill "TX Rate" 11 " "].[$fill "RX Rate" 11 " "].[$fill "Uptime" 14 " "].[$fill "Bytes" 21 " "].[$fill "Packets" 15 " "]."Interface");
    :foreach i in=[/caps-man registration-table find .id] do={
       :local locMAC    [/caps-man registration-table get $i mac-address];
       :local locInt    [/caps-man registration-table get $i interface];
       :local locSSID   [/caps-man registration-table get $i ssid];
       :local locSignal [/caps-man registration-table get $i rx-signal];
       :local loctxRate [/caps-man registration-table get $i tx-rate];
       # сокращаем до нужных данных: "173.3Mbps-20MHz/2S/SGI" --> "173.3Mbps"  
       :if ([:find $loctxRate "-" -1] > 0) do={ :set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]];}
       :local locrxRate [/caps-man registration-table get $i rx-rate];
       :if ([:find $locrxRate "-" -1] > 0) do={ :set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]];}
       :local locUptime [/caps-man registration-table get $i uptime];
       :set locUptime    [:pick $locUptime 0 [:find $locUptime "." -1]];
       :local locBytes  [/caps-man registration-table get $i bytes];
       :local locPack    [/caps-man registration-table get $i packets];
       # если мы на Slave интерфейсе, нужно взять Radio MAC главного интерфейса  
       :local locMasterInt [/caps-man interface get [/caps-man interface find name=$locInt] master-interface];
       :local locRadioMAC;  
       :if ($locMasterInt = "none") do={set locRadioMAC [/caps-man interface get [/caps-man interface find name=$locInt] radio-mac]} else={set locRadioMAC [/caps-man interface get [/caps-man interface find name=$locMasterInt] radio-mac]}
       :local locCAP;  
       :do {set $locCAP  [/caps-man radio get [/caps-man radio find radio-mac=$locRadioMAC] remote-cap-identity]} on-error={:put ("ERROR - ".$locMAC." - ".$locRadioMAC)};
       # получаем IP и имя с DHCP сервера (если есть)  
       :local locIP;  
       :local locName;  
       :if ([/ip dhcp-server lease find mac-address=$locMAC]) do={
           :do {set $locIP   [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] address]} on-error={set $locIP "DCHP-Err"; put ("ERROR with ".$locMAC." - Please check DHCP for duplicate entries")};
           :do {set $locName [/ip dhcp-server lease get [/ip dhcp-server lease find mac-address=$locMAC] host-name]} on-error={set $locName "DHCP-Err"};
       } else={  
           set $locIP "noDHCP";  
           set $locName "noDHCP";  
       }  
       :if ($locSignal <= -70) do={  
           # плохой сигнал – выводим строку красным  
           :terminal style varname;  
           :put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 10 " "].[$fill $locSignal 7 " "].[$fill $locSSID 18 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 21 " "].[$fill $locPack 15 " "].$locInt);
           :terminal style none;  
       } else={  
           :put ([$fill $locMAC 19 " "].[$fill $locIP 17 " "].[$fill $locName 12 " "].[$fill $locCAP 10 " "].[$fill $locSignal 7 " "].[$fill $locSSID 18 " "].[$fill $loctxRate 11 " "].[$fill $locrxRate 11 " "].[$fill $locUptime 14 " "].[$fill $locBytes 21 " "].[$fill $locPack 15 " "].$locInt);
       }  
    }
     
     
     
    rextended
    Guest
    #4
    0
    13.02.2023 16:55:00
    Проверьте на ошибки и немного оптимизируйте... Вот скрипт:

    :global fill do={
       :local STR  $1
       :local LEN  $2
       :local CHAR $3
       :if ([:len $STR] >= $LEN) do={
           :set STR "$[:pick $STR 0 ($LEN-1)]$CHAR"
       } else={
           :for i from=1 to=($LEN-[:len $STR]) step=1 do={
               :set STR "$STR$CHAR"
           }
       }
       :return $STR
    }

    :put "$[$fill "MAC" 19 " "]$[$fill "IP" 17 " "]$[$fill "Client" 12 " "]$[$fill "AP" 10 " "]$[$fill "Signal" 7 " "]$[$fill "SSID" 18 " "]$[$fill "TX Rate" 11 " "]$[$fill "RX Rate" 11 " "]$[$fill "Uptime" 14 " "]$[$fill "Bytes" 21 " "]$[$fill "Packets" 15 " "]Interface"
    /caps-man registration-table
    :foreach i in=[find] do={
       :local locMAC    [get $i mac-address]
       :local locInt    [get $i interface]
       :local locSSID   [get $i ssid]
       :local locSignal [get $i rx-signal]
       :local loctxRate [get $i tx-rate]
       :if ([:find $loctxRate "-" -1] > 0) do={:set loctxRate [:pick $loctxRate 0 [:find $loctxRate "-" -1]]}
       :local locrxRate [get $i rx-rate]
       :if ([:find $locrxRate "-" -1] > 0) do={:set locrxRate [:pick $locrxRate 0 [:find $locrxRate "-" -1]]}
       :local locUptime [get $i uptime]
       :set   locUptime [:pick $locUptime 0 [:find $locUptime "." -1]]
       :local locBytes  [get $i bytes]
       :local locPack   [get $i packets]
       /caps-man interface
       :local locMasterInt [get [find where name=$locInt] master-interface]
       :local locRadioMAC  "00:00:00:00:00:00"
       :if ($locMasterInt = "none") do={:set locRadioMAC [get [find where name=$locInt] radio-mac]} else={:set locRadioMAC [get [find where name=$locMasterInt] radio-mac]}
       :local locCAP ""
       /caps-man radio
       :do {:set locCAP [get [find where radio-mac=$locRadioMAC] remote-cap-identity]} on-error={:put "ERROR - $locMAC - $locRadioMAC"}
       :local locIP   "noDHCP"
       :local locName "noDHCP"
       /ip dhcp-server lease
       :if ([find where mac-address=$locMAC]) do={
           :do {:set locIP   [get [find where mac-address=$locMAC] address ]} on-error={:set locIP "DCHP-Err"; :put "ERROR with $locMAC - Please check DHCP for duplicate entries"}
           :do {:set locName [get [find where mac-address=$locMAC] host-name]} on-error={:set locName "DHCP-Err"}
       }
       :if ($locSignal <= -70) do={:terminal style varname} else={:terminal style none}
       :put "$[$fill $locMAC 19 " "]$[$fill $locIP 17 " "]$[$fill $locName 12 " "]$[$fill $locCAP 10 " "]$[$fill $locSignal 7 " "]$[$fill $locSSID 18 " "]$[$fill $loctxRate 11 " "]$[$fill $locrxRate 11 " "]$[$fill $locUptime 14 " "]$[$fill $locBytes 21 " "]$[$fill $locPack 15 " "]$locInt"
    }
     
     
     
    4L3xN3t
    Guest
    #5
    0
    03.05.2024 06:20:00
    Привет, где будут показывать эту информацию?
     
     
     
    marcin685
    Guest
    #6
    0
    14.01.2025 22:02:00
    У кого-нибудь есть изменённый скрипт для нового CAPSMAN, например, для hAP AX2, где CAPSMAN находится в /interface/wifi/registration-table?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры