Скрипт вывода списка подключенных к роутеру устройств

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Завёл я скрипт. Отработал он нормально. Вот вывод.

Код: Выделить всё

NUMBER INTERFACE             HOST NAME                 MAC ADDRESS         IP ADDRESS           NETWORK           COMMENT                         
                                                                                                                                           
1      ether1                MB2020RU_1D2F41           00:80:F0:1D:2F:41   192.168.88.206       bridge            Printer                         
2      ether1                hEX_POE                   64:D1:54:3C:01:68   192.168.88.40        bridge                                     
3      ether1                wAP                       64:D1:54:FF:57:66   192.168.88.50        bridge                                     
4      ether1                Papa                      D4:3D:7E:E3:09:11   192.168.88.250       bridge            My PC                         
5      ether1                RedmiNote4-Redmi          EC:D0:9F:3A:45:64   192.168.88.254       bridge            My phone                         
6      ether3                hEX                       64:D1:54:A1:64:E7   192.168.88.1/24      bridge            mAP                         
7      ether3                                          6C:3B:6B:FA:02:6B   192.168.88.100       bridge                                     
8      ether3                 >> IP/ARP <<             6C:3B:6B:FA:02:6A   192.168.88.100       bridge            MikroTik-mAP                       
9      ether4                DESKTOP-LQ57K59           00:F1:F3:03:2E:C6   192.168.88.203       bridge            Sava                         
10     ether4                hEX                       64:D1:54:A1:64:E8   192.168.88.1/24      bridge            Sava comp                         
11     ether5                 >> IP/ARP <<             60:2E:20:1F:AF:9D   10.201.7.254         GATEWAY                                    
12     ether5                hEX                       64:D1:54:A1:64:E9   10.201.7.18/24       10.201.7.0        WAN                         
13     bridge                 >> IP/ARP <<             C4:6E:1F:02:05:2F   192.168.88.250                         My komp                         
14     bridge                 >> IP/ARP <<             00:26:B6:E8:EE:DC   192.168.88.230                         Sony note                         
15     bridge                 >> IP/ARP <<             E8:4E:06:08:89:30   192.168.88.240                         Netbook                         
16     bridge                 >> IP/ARP <<             28:39:5E:42:EC:8F   192.168.88.210                         Samsung_TV                         
17     bridge                 >> IP/ARP <<             48:88:CA:C8:03:A6   192.168.88.180                         Kseniya phone                      
18     bridge                 >> IP/ARP <<             04:B1:67:21:1B:F0   192.168.88.208                         Yuliya phone                       
19     bridge                 >> IP/ARP <<             00:0C:42:6C:10:92   192.168.88.60                          MikroTik-RB433UAH                  
20     bridge                 >> IP/ARP <<             EC:D0:9F:0F:FA:84   192.168.88.205                         Pashka                         
21     bridge                 >> IP/ARP <<             1C:B7:2C:EB:E4:74   192.168.88.202                         Papa planshet                      
22     bridge                 >> IP/ARP <<             00:03:AB:E5:15:32   192.168.88.248                         HT20                         
23     bridge                 >> IP/ARP <<             00:8E:05:00:94:7B   192.168.88.207                         Onda                         
24     bridge                 >> IP/ARP <<             20:A6:0C:11:64:45   192.168.88.187                         Mama phone                         
25     bridge                 >> IP/ARP <<             F4:60:E2:A2:34:74   192.168.88.184                         Redmi 6                         
26     bridge                 >> IP/ARP <<             C0:B6:58:4E:29:81   192.168.88.183                         Anna                         
27     bridge                 >> IP/ARP <<             80:35:C1:4A:43:68   192.168.88.182                         Kirill                         
28     bridge                 >> IP/ARP <<             94:E0:D6:5E:99:C5   192.168.88.171                         TV_box                         
29     bridge                 >> IP/ARP <<             20:34:FB:B7:BC:AF   192.168.88.151                                                  
30     bridge                 >> IP/ARP <<             74:23:44:1D:E2:85   192.168.88.163                         Lena phone                         
31     bridge                hEX                       64:D1:54:A1:64:E5   192.168.88.1/24      192.168.88.0                               
32     loopback              hEX                       5A:21:87:4D:27:23   10.255.255.1/32      10.255.255.1                               
33     ovpn-out-1195-DO      hEX                       02:0E:38:68:2C:51   10.12.0.2/32         10.12.0.1         No activity dublicat canal to Europ
34     ovpn-out-DO           hEX                       02:0E:38:68:2C:51   10.9.0.2/32          10.9.0.1          General canal to Europa            
35     sstp-client-mic       hEX                                           10.10.10.1/32        10.10.10.2        To Papa flat tunnel     
Что интересно. Под HOST NAME с обозначением >> IP/ARP << у меня высветило не присоединённые сейчас устройства, а то, что у меня прибито в ARP намертво для своих целей. Я не думаю, что эта инфа должна была выпадать при срабатывании скрипта. Наверное всё же актуальны именно активные на данный момент хосты. Ну и туннель ipv4 to ipv6 вообще не определяется и не виден. Простите за въедливость :smu:sche_nie:


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день.
podarok66 писал(а): 15 окт 2020, 21:19 Под HOST NAME с обозначением >> IP/ARP << у меня высветило не присоединённые сейчас устройства, а то, что у меня прибито в ARP намертво для своих целей. Я не думаю, что эта инфа должна была выпадать при срабатывании скрипта. Наверное всё же актуальны именно активные на данный момент хосты.
У каждой записи в ARP листе имеются флаги: X - disabled, I - invalid, H - DHCP, D - dynamic, P - published, C - complete.
В очередной версии скрипта я ограничил выборку ARP записей флагом "complete", но я не уверен в правильности такой выборки. Проверьте, насколько результат работы этой версии скрипта соответствует Вашим ожиданиям?
podarok66 писал(а): 15 окт 2020, 21:19 Ну и туннель ipv4 to ipv6 вообще не определяется и не виден.
Пока не добрался.
podarok66 писал(а): 15 окт 2020, 21:19 Простите за въедливость :smu:sche_nie:
Ну а как иначе-то? Вроде так и должно быть... :)

Ниже очередной подправленный вариант скрипта:

Код: Выделить всё


# Script for building a network table by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.47
# updated 2020/10/17

# interface list
:global interfaceIndexArray 0;
:global interfaceArray {"";"";"";""};
foreach interfaceIndex in=[ /interface find running=yes; ] do={
    :local interfaceName         ([ /interface get $interfaceIndex name; ]);
    :local interfaceHost         ([ /system resource get board-name; ]);
    :local interfaceMAC          ([ /interface get $interfaceIndex mac-address; ]);
    :local interfaceComment      ([ /interface get $interfaceIndex comment; ]);
    :set ($interfaceArray->$interfaceIndexArray) {$interfaceName;$interfaceHost;$interfaceMAC;$interfaceComment};
    :set interfaceIndexArray ($interfaceIndexArray + 1);
}
:set interfaceIndexArray ($interfaceIndexArray - 1);

# interface bridge host list
:global bridgeHostIndexArray 0;
:global bridgeHostArray {"";"";"";"";"";""};
foreach bridgeHost in=[ /interface bridge host find; ] do={
    :do {
        :local hostInterface     ([ /interface bridge host get $bridgeHost on-interface; ]);
        :local hostMAC           ([ /interface bridge host get $bridgeHost mac-address; ]);
        :local hostBridge        ([ /interface bridge host get $bridgeHost bridge; ]);
        :local hostComment       ("");
        :local hostName          ("");
        :local hostIP            ("");
        if ([ /interface bridge host get $bridgeHost local; ] = true) do={ 
            :set hostName        ([ /system resource get board-name; ]);
            :set hostIP          ([ /ip address get [ find interface=$hostBridge ] address; ]);
        } else={
            :do {
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] address; ]);
                :set hostComment ([ /ip dhcp-server lease get [ find mac-address=$hostMAC ] comment; ]);
            } on-error={ 
                :set hostName    ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] host-name; ]);
                :set hostIP      ([ /ip dhcp-server lease get [ find mac-address=$hostMAC dynamic=yes ] address; ]);
            }
        }
        :set ($bridgeHostArray->$bridgeHostIndexArray) {$hostInterface;$hostName;$hostMAC;$hostIP;$hostBridge;$hostComment};
        :set bridgeHostIndexArray ($bridgeHostIndexArray + 1);
    } on-error={ }
}
:set bridgeHostIndexArray ($bridgeHostIndexArray - 1);

# ip address list
:global ipAddressIndexArray 0;
:global ipAddressArray {"";"";"";""};
foreach ipAddress in=([ /ip address find; ]) do={
    :local ipAddressInterface    ([ /ip address get $ipAddress interface; ]); 
    :local ipAddressIP           ([ /ip address get $ipAddress address; ]); 
    :local ipAddressNetwork      ([ /ip address get $ipAddress network; ]);
    :local ipAddressComment      ([ /ip address get $ipAddress comment; ]);
    :set ($ipAddressArray->$ipAddressIndexArray) {$ipAddressInterface;$ipAddressIP;$ipAddressNetwork;$ipAddressComment};
    :set ipAddressIndexArray ($ipAddressIndexArray + 1);
}
:set ipAddressIndexArray ($ipAddressIndexArray - 1);

# ip arp list
:global ipArpIndexArray 0;
:global ipArpArray {"";"";"";"";""}; 
foreach ipArp in=([ /ip arp find complete=yes; ]) do={
    :local ipArpInterface        ([ /ip arp get $ipArp interface; ]); 
    :local ipArpMACAddress       ([ /ip arp get $ipArp mac-address; ]);
    :local ipArpIP               ([ /ip arp get $ipArp address; ]); 
    :local ipArpComment          ([ /ip arp get $ipArp comment; ]);
    :local ipArpNetwork          ("");
    :do { 
        :set ipArpNetwork        ([ /ip dhcp-client get [find interface=$ipArpInterface ] gateway ]); 
    } on-error={ }
    if ($ipArpNetwork = $ipArpIP) do={ :set ipArpNetwork ("GATEWAY"); }
    :local equalMACAddress (false);
    for i from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($ipArpMACAddress) in=($bridgeHostArray->$i)];
        if ([:tostr [$findDestination]] != "") do={ :set equalMACAddress (true); }
    }
    if ($equalMACAddress = false) do={
        :do {
            if ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ] != "") do={
                :set ipArpNetwork ($ipArpInterface);
                :set ipArpInterface ([ /interface bridge host get [ find mac-address=$ipArpMACAddress ] on-interface; ]);
            }
        } on-error={ }
        :set ($ipArpArray->$ipArpIndexArray) {$ipArpInterface;$ipArpMACAddress;$ipArpIP;$ipArpNetwork;$ipArpComment};
        :set ipArpIndexArray ($ipArpIndexArray + 1);
    }
}
:set ipArpIndexArray ($ipArpIndexArray - 1);

# build new list
:global newIndexArray 2;
:global newArray {"";"";"";"";"";"";""};
:set ($newArray->0) {"NUMBER";"INTERFACE";"HOST NAME";"MAC ADDRESS";"IP ADDRESS";"NETWORK";"COMMENT"};
:set ($newArray->1) {"";"";"";"";"";"";""};
for i from=0 to=$interfaceIndexArray do={
    for j from=0 to=$bridgeHostIndexArray do={
        :local findDestination [:find key=($bridgeHostArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "" && ($bridgeHostArray->$j->4) != ($bridgeHostArray->$j->0)) do={
            if (($bridgeHostArray->$j->2) = ($interfaceArray->$i->2)) do={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($interfaceArray->$i->3)}; 
            } else={
                :set ($newArray->$newIndexArray) {$newIndexArray-1;($bridgeHostArray->$j->0);($bridgeHostArray->$j->1);($bridgeHostArray->$j->2);($bridgeHostArray->$j->3);($bridgeHostArray->$j->4);($bridgeHostArray->$j->5)}; 
            }
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipArpIndexArray do={
        :local findDestination [:find key=($ipArpArray->$j->0) in=($interfaceArray->$i)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($ipArpArray->$j->0);" >> IP/ARP <<";($ipArpArray->$j->1);($ipArpArray->$j->2);($ipArpArray->$j->3);($ipArpArray->$j->4)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
    for j from=0 to=$ipAddressIndexArray do={
        :local findDestination [:find key=($interfaceArray->$i->0) in=($ipAddressArray->$j)];
        if ([:tostr [$findDestination]] != "") do={
            :set ($newArray->$newIndexArray) {$newIndexArray-1;($interfaceArray->$i->0);($interfaceArray->$i->1);($interfaceArray->$i->2);($ipAddressArray->$j->1);($ipAddressArray->$j->2);($interfaceArray->$i->3)}; 
            :set newIndexArray ($newIndexArray + 1);
        }
    }
}
:set newIndexArray ($newIndexArray - 1);

# list output to terminal
for i from=0 to=$newIndexArray do={
    :set ($newArray->$i->0) ([:pick [:tostr [($newArray->$i->0 . "                         ")]] 0  6 ]);
    :set ($newArray->$i->1) ([:pick [:tostr [($newArray->$i->1 . "                         ")]] 0 21 ]);
    :set ($newArray->$i->2) ([:pick [:tostr [($newArray->$i->2 . "                         ")]] 0 25 ]);
    :set ($newArray->$i->3) ([:pick [:tostr [($newArray->$i->3 . "                         ")]] 0 19 ]);
    :set ($newArray->$i->4) ([:pick [:tostr [($newArray->$i->4 . "                         ")]] 0 20 ]);
    :set ($newArray->$i->5) ([:pick [:tostr [($newArray->$i->5 . "                         ")]] 0 17 ]);
    :set ($newArray->$i->6) ([:pick [:tostr [($newArray->$i->6 . "                         ")]] 0 35 ]);
    :put (($newArray->$i->0)." ".($newArray->$i->1)." ".($newArray->$i->2)." ".($newArray->$i->3)." ".($newArray->$i->4)." ".($newArray->$i->5)." ".($newArray->$i->6));
}

# clearing variables
:set interfaceIndexArray (:);
:set interfaceArray (:);
:set bridgeHostIndexArray (:);
:set bridgeHostArray (:);
:set ipAddressIndexArray (:);
:set ipAddressArray (:);
:set ipArpIndexArray (:);
:set ipArpArray (:);
:set newIndexArray (:);
:set newArray (:);

Последний раз редактировалось drpioneer 20 фев 2021, 08:52, всего редактировалось 2 раза.


yurchenkoyuriy
Сообщения: 10
Зарегистрирован: 08 фев 2021, 20:45

Вау! Вот это работа!

А чтобы результат отправить в телегу, надо убрать вывод в терминал и добавить параметры отправки?

ps.. Другую инфу в телегу умею отправлять


GRISHA765
Сообщения: 3
Зарегистрирован: 01 ноя 2020, 18:18

Хотелось бы такойже скрипт для телеграмма. А вот как сделать так я незнаю.


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

yurchenkoyuriy писал(а): 09 фев 2021, 17:55 А чтобы результат отправить в телегу
GRISHA765 писал(а): 11 фев 2021, 18:46 Хотелось бы такойже скрипт для телеграмма. А вот как сделать так я незнаю.
дык тут знать то много и не нада, результаты данного скрипта записываем в переменную, содержимое данной переменной отправляем в телегу например простым скриптом telega_test из моей темы управление с телеги


yurchenkoyuriy
Сообщения: 10
Зарегистрирован: 08 фев 2021, 20:45

Virtue писал(а): 11 фев 2021, 23:52
yurchenkoyuriy писал(а): 09 фев 2021, 17:55 А чтобы результат отправить в телегу
GRISHA765 писал(а): 11 фев 2021, 18:46 Хотелось бы такойже скрипт для телеграмма. А вот как сделать так я незнаю.
дык тут знать то много и не нада, результаты данного скрипта записываем в переменную, содержимое данной переменной отправляем в телегу например простым скриптом telega_test из моей темы управление с телеги

Спасибо большое! Буду пробовать


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Ну да, а если у человека встретиться в названии интерфейса или ещё где-то хоть один не поддерживаемый Телеграммом символ (русская буква или спец. символ), то ничего никуда не отправится ...
Сначала конвертировать надо в UTF-8 ...

https://habr.com/en/post/518534/

Так что дык нада знать кое-чо всё таке ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Учитывая все замечания, думаю, не будет большой проблемой написать требуемый скрипт.
Но возникают следующие вопросы:
- как вывести таблицу так, чтобы её было удобно смотреть в мессенжере на телефоне?
- по какому событию должна формироваться и отправляться таблица?
- нафига это надо, когда можно всё тоже самое сделать по необходимости через Winbox? И оно уже РАБОТАЕТ!!!


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

нафига это надо
Вот самый правильный вопрос и одновременно ответ на него.

Мониторировать нужно что-то существенное, а не всё подряд. Но некоторым хочется иметь ощущение полного контроля над ситуацией ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
aladdin
Сообщения: 1
Зарегистрирован: 26 фев 2021, 23:46

Доброй ночи! Простите за глупый вопрос я тут новичок. Создал скрипт в System/Script через + вставил содержимое скрипа, сохранил и запустил. Как увидеть полученный результат, заранее прошу сильно не бейте :smu:sche_nie:


Ответить