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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

aladdin писал(а): 27 фев 2021, 00:15 Создал скрипт в System/Script через + вставил содержимое скрипа, сохранил и запустил. Как увидеть полученный результат
Добрый день.

Код нужно скопировать в буфер и просто вставить в терминал Mikrotik'а - там и увидите результат.


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую.
sergs писал(а): 28 сен 2020, 09:08 Идея скрипта классная, жаль что у меня не работает, вот вывод:

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

NUMBER INTERFACE             HOST NAME                 MAC ADDRESS         IP ADDRESS           NETWORK           COMMENT                            
                                                                                                                                                     
1      ether1                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CB   192.168.0.251/24     bridge1           
2      ether2                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CC   192.168.0.251/24     bridge1                                    
3      ether3                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CD   192.168.0.251/24     bridge1                                    
4      ether5                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CF   192.168.0.251/24     bridge1                                    
5      ether7                CRS354-48G-4S+2Q+         C4:AD:34:B7:93:D1   192.168.0.251/24     bridge1                                    
...                           
38     bridge1               CRS354-48G-4S+2Q+         C4:AD:34:B7:93:CB   192.168.0.251/24     192.168.0.0     
Дело в том, что этот CRS работает как switch и не является шлюзом по умолчанию иip/arp пустой !

в данном случае лучше список MAC адресов и на каких они интерфейсах получать в bridge/hosts
затем командой tool ip-scan получить соответствие MACу IP и DNS имя!
остается сопоставить интерфейсы по мак адресам с остальной информацией и свести все в одну таблицу.
Попытался прикрутить вашу задумку к уже существующему скрипту...
Для этого в начале выполняется команда tool ip-scan , тем самым наполняется список ip/arp, после чего выполняется остальная часть скрипта.

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



# Script for building a network table by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=70575
# tested on ROS 6.48
# updated 2021/03/29

:do {
    # tools ip scan list
    /tool ip-scan duration=30s;
    
    # interface list
    :local interfaceIndexArray 0;
    :local interfaceArray {"";"";"";""};
    :foreach interfaceIndex in=[ /interface find running=yes; ] do={
        :local interfaceName         ([ /interface get $interfaceIndex name; ]);
        :local interfaceHost         ([ /system identity get 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
    :local bridgeHostIndexArray 0;
    :local 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 identity get 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
    :local ipAddressIndexArray 0;
    :local 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
    :local ipArpIndexArray 0;
    :local ipArpArray {"";"";"";"";""}; 
    :foreach ipArp in=([ /ip arp find; ]) 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;$ipArpComment;$ipArpNetwork};
            :set ipArpIndexArray ($ipArpIndexArray + 1);
        }
    }
    :set ipArpIndexArray ($ipArpIndexArray - 1);

    # build new list
    :local newIndexArray 2;
    :local 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);"";($ipArpArray->$j->1);($ipArpArray->$j->2);($ipArpArray->$j->4);($ipArpArray->$i->3)}; 
                :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));
    }
}



Надеюсь, так лучше...


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

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


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

GRISHA765 писал(а): 05 апр 2021, 22:30 Как я не сувал он спамит, каждое сообщение с ip, не сразу всю инфу а отдельно.
у телеги есть ограничения на количество символов в одном сообщении..
вы определитесь сначала какую инфу будете отправлять, затем нужно будет запихнуть ее в переменную, как это сделать проще посмотреть в моей теме (оповещение в телегу) и сделать по аналогии


heracker
Сообщения: 2
Зарегистрирован: 06 фев 2024, 10:12

drpioneer писал(а): 27 фев 2021, 07:16
aladdin писал(а): 27 фев 2021, 00:15 Создал скрипт в System/Script через + вставил содержимое скрипа, сохранил и запустил. Как увидеть полученный результат
Добрый день.

Код нужно скопировать в буфер и просто вставить в терминал Mikrotik'а - там и увидите результат.
Добрый день!

Сорри за некропостинг.
Прекрасный скрипт
Как бы его результат вывести в файл?
Чтобы дергать его по триггеру и забирать результат в файле.


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую!
heracker писал(а): 06 фев 2024, 10:17 Прекрасный скрипт
Как бы его результат вывести в файл?
Чтобы дергать его по триггеру и забирать результат в файле.
:men: Получите-распишитесь:

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




# Script for building a network table by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=92265#p92265
# tested on ROS 6.49.10 & 7.12
# updated 2024/02/06

:do {
  :local myFile "";     # file name, for example "nmap.txt"

  # tool ip-scan list
  /tool ip-scan duration=30s;

  # interface list
  :local ifcCnt 0; :local ifc {"";"";"";""};
  /interface;
  :foreach ifcIdx in=[find running=yes] do={
    :local ifcNam [get $ifcIdx name];
    :local ifcMac [get $ifcIdx mac-address];
    :local ifcCmt [get $ifcIdx comment];
    :local ifcHst [/system identity get name];
    :set ($ifc->$ifcCnt) {$ifcNam;$ifcHst;$ifcMac;$ifcCmt};
    :set ifcCnt ($ifcCnt+1);
  }
  :set ifcCnt ($ifcCnt-1);

  # bridge host list
  :local hstCnt 0; :local hst {"";"";"";"";"";""};
  /interface bridge host;
  :foreach hstIdx in=[find] do={
    :do {
      :local hstCmt ""; :local hstNam ""; :local hstIpa "";
      :local hstIfc [get $hstIdx on-interface];
      :local hstMac [get $hstIdx mac-address];
      :local hstBrg [get $hstIdx bridge];
      :if ([get $hstIdx local]=true) do={ 
        :set hstNam [/system identity get name];
        :set hstIpa [/ip address get [find interface=$hstBrg] address];
      } else={
        /ip dhcp-server lease;
        :do {
          :set hstNam [get [find mac-address=$hstMac] host-name];
          :set hstIpa [get [find mac-address=$hstMac] address];
          :set hstCmt [get [find mac-address=$hstMac] comment];
        } on-error={
          :set hstNam [get [find mac-address=$hstMac dynamic=yes] host-name];
          :set hstIpa [get [find mac-address=$hstMac dynamic=yes] address];
        }
      }
      :set ($hst->$hstCnt) {$hstIfc;$hstNam;$hstMac;$hstIpa;$hstBrg;$hstCmt};
      :set hstCnt ($hstCnt+1);
    } on-error={}
  }
  :set hstCnt ($hstCnt-1);

  # ip address list
  :local ipaCnt 0; :local ipa {"";"";"";""};
  /ip address;
  :foreach ipaIdx in=[find] do={
    :local ipaIfc [get $ipaIdx interface];
    :local ipaAdr [get $ipaIdx address];
    :local ipaNet [get $ipaIdx network];
    :local ipaCmt [get $ipaIdx comment];
    :set ($ipa->$ipaCnt) {$ipaIfc;$ipaAdr;$ipaNet;$ipaCmt};
    :set ipaCnt ($ipaCnt+1);
  }
  :set ipaCnt ($ipaCnt-1);

  # ip arp list
  :local arpCnt 0; :local arp {"";"";"";"";""};
  /ip arp;
  :foreach arpIdx in=[find] do={
    :local arpIfc [get $arpIdx interface];
    :local arpIpa [get $arpIdx address];
    :local arpMac [get $arpIdx mac-address];
    :local arpCmt [get $arpIdx comment];
    :local arpNet "";
    :do {:set arpNet [/ip dhcp-client get [find interface=$arpIfc] gateway]} on-error={}
    :if ($arpNet=$arpIpa) do={:set arpNet "GATEWAY"}
    :local equMac false;
    :for i from=0 to=$hstCnt do={
      :local fndDst [:find key=$arpMac in=($hst->$i)];
      :if ([:tostr [$fndDst]]!="") do={:set equMac true}
    }
    :if ($equMac=false) do={
      :do {
        /interface bridge host;
        :if ([get [find mac-address=$arpMac] on-interface]!="") do={
          :set arpNet $arpIfc;
          :set arpIfc [get [find mac-address=$arpMac] on-interface];
        }
      } on-error={}
      :set ($arp->$arpCnt) {$arpIfc;$arpMac;$arpIpa;$arpCmt;$arpNet};
      :set arpCnt ($arpCnt+1);
    }
  }
  :set arpCnt ($arpCnt-1);

  # build list
  :local arrIdx 1; :local arr {"";"";"";"";"";"";""};
  :set ($arr->0) {"NUMBER";"INTERFACE";"HOST-NAME";"MAC-ADDRESS";"IP-ADDRESS";"NETWORK";"REMARK"};
  :set ($arr->1) {"";"";"";"";"";"";""};
  :for i from=0 to=$ifcCnt do={
    :for j from=0 to=$hstCnt do={
      :local fndDst [:find key=($hst->$j->0) in=($ifc->$i)];
      :if ([:tostr [$fndDst]]!="" && ($hst->$j->4)!=($hst->$j->0)) do={
        :if (($hst->$j->2)=($ifc->$i->2)) do={
          :set ($arr->$arrIdx) {$arrIdx;($hst->$j->0);($hst->$j->1);($hst->$j->2);($hst->$j->3);($hst->$j->4);($ifc->$i->3)}; 
        } else={
          :set ($arr->$arrIdx) {$arrIdx;($hst->$j->0);($hst->$j->1);($hst->$j->2);($hst->$j->3);($hst->$j->4);($hst->$j->5)}; 
        }
        :set arrIdx ($arrIdx+1);
      }
    }
    :for j from=0 to=$arpCnt do={
      :local fndDst [:find key=($arp->$j->0) in=($ifc->$i)];
      :if ([:tostr [$fndDst]]!="") do={
        :set ($arr->$arrIdx) {$arrIdx;($arp->$j->0);"";($arp->$j->1);($arp->$j->2);($arp->$j->4);($arp->$i->3)}; 
        :set arrIdx ($arrIdx+1);
      }
    }
    :for j from=0 to=$ipaCnt do={
      :local fndDst [:find key=($ifc->$i->0) in=($ipa->$j)];
      :if ([:tostr [$fndDst]]!="") do={
        :set ($arr->$arrIdx) {$arrIdx;($ifc->$i->0);($ifc->$i->1);($ifc->$i->2);($ipa->$j->1);($ipa->$j->2);($ifc->$i->3)}; 
        :set arrIdx ($arrIdx+1);
      }
    }
  }
  :set arrIdx ($arrIdx-1);

  # output list
  :global outNetMap "";
  :local TextCut do={:return [:pick "$1                                             " 0 $2]}
  :for i from=0 to=$arrIdx do={
    :set outNetMap ("$outNetMap\r\n$[$TextCut ($arr->$i->0) 3]\t$[$TextCut ($arr->$i->3) 17]\t$[$TextCut ($arr->$i->4) 18]\t\
    $[$TextCut ($arr->$i->1) 18]\t$[$TextCut ($arr->$i->5) 15]\t$[$TextCut ($arr->$i->2) 21]\t$[$TextCut ($arr->$i->6) 35]");
  }
  :put ("---------------------------------------------------------------------------------------------------------------------------$outNetMap");
  :if ([:len $myFile]!=0) do={
    :local fileName ("$[/system identity get name]_$myFile");
    :execute script=":global outNetMap; :put (\"$outNetMap\");" file=$fileName;
    :put ("File '$fileName' was successfully created");
  } else={:put ("File creation is not enabled")}
} on-error={:put "Problem in work 'NetMap' script"}
/system script environment remove [find name~"outNetMap"];


Зеркало тут.


heracker
Сообщения: 2
Зарегистрирован: 06 фев 2024, 10:12

Зеркало тут.


Спасибо огромное за скрипт, и главное за быстрый ответ!
:ya_hoo_oo:


Ответить