Добрый день.
Код нужно скопировать в буфер и просто вставить в терминал Mikrotik'а - там и увидите результат.
Попытался прикрутить вашу задумку к уже существующему скрипту...sergs писал(а): ↑28 сен 2020, 09:08 Идея скрипта классная, жаль что у меня не работает, вот вывод:Дело в том, что этот CRS работает как switch и не является шлюзом по умолчанию иip/arp пустой !Код: Выделить всё
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
в данном случае лучше список MAC адресов и на каких они интерфейсах получать в bridge/hosts
затем командой tool ip-scan получить соответствие MACу IP и DNS имя!
остается сопоставить интерфейсы по мак адресам с остальной информацией и свести все в одну таблицу.
Код: Выделить всё
# 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));
}
}
я очень тупой а как засунуть информацию скрипта в переменную. Как я не сувал он спамит, каждое сообщение с ip, не сразу всю инфу а отдельно.
у телеги есть ограничения на количество символов в одном сообщении..
Код: Выделить всё
# 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"];
Такой функционал в скрипте не предусмотрен.
На приложенном скриншоте представлены только факты сохранения скрипта 'NetMap' после внесения очередных изменений в него пользователем 'admin'.
Опишите подробнее, как выглядит неработоспособность вывода отчета?
Последняя строка скрипта содержит в себе команду на удаление глобальной переменной 'outNetMap'. Вполне возможно, когда в процессе работы скрипта по какой-то причине возникают ошибки и дело не доходит до выполнения последней строки, тогда эта переменная остаётся в памяти устройства.
Пишу для покрытия своих потребностей и делюсь наработками с общественностью...
Результат работы скрипта выводится в терминал.
Запускайте скрипт из терминала.
Возможно для решения этой задачи вам подойдет скрипт мониторинга клиентов сети в связке со скриптом оповещения в ТелеграмDmSp писал(а): ↑26 сен 2024, 19:12 1. Такой функционал в скрипте не предусмотрен.
Ясно, что не предусмотрен. Очень мне понравилось играть со скриптами, шикарно расширяют возможности роутера. Для себя вижу отличное применение данного скрипта это удалённо, по запросу через бота ТГ получить список хостов, находясь вдали от роутера. Но как это сделать не знаю. Вот и написал тут.