Поисковые конструкции в Mikrotik
Mikrotik — замечательная роутер ОС. Богатые возможности и стабильность работы подкупают, заставляя задуматься, на сколько выгоднее работать с ней, а не допустим с Cisco. Так как частенько приходится сталкиваться с некоторыми задачами на Mikrotik, буду публиковать интересные приемы.
В данном посте мы рассмотрим разные методы поиска строк в списках Mikrotik, ну и что-нибудь сделаем с ними.
Для чего нам может понадобиться поиск в списках?
Все просто — списки, это гибкий инструмент по фильтрации доступа к сервисам и на основе них делают разграничение доступа по IP.
Допустим у нас есть лист под именем access-inet. Давайте посмотрим:
> ip firewall address-list print where list=access-inet
Flags: X - disabled, D - dynamic
# LIST ADDRESS
228 ;;; cid=3931;rule_id=18;
access-inet 10.60.10.229
230 ;;; cid=2796;rule_id=7;
access-inet 10.60.2.201
232 ;;; cid=1825;rule_id=18;
access-inet 10.60.8.202
Замечательно. Что с ним можно сделать.
1. Удалить все элементы списка, если есть точное название листа:
> :foreach i in [/ip firewall address-list find where list=access-inet] do={/ip firewall address-list remove $i};
2. Так же можно удалить элементы в группе листов по частичному вхождению имени листа (по маске):
> :foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i list] "access-"]=0) do={/ip firewall address-list remove $i}};
Удалятся элементы во всех листах, в имени которого есть access-
3. Удалять можно не только по имени листа, но и по любому аттрибуту. К примеру комментарию, так как очень часто в него заносят расширенные данные, которые как раз и могут пригодится для поиска таких адресов в списках. К примеру найдем в листах access-inet все элементы с комментарием cid=100; и удалим их:
> :foreach i in [/ip firewall address-list find where list=access-inet] do={:if ([:find [/ip firewall address-list get $i comment] "cid=100;"]=0) do={/ip firewall address-list remove $i}};
Как видите — все довольно просто. Синтаксис конечно не очень дружелюбный, но зато можно гибко задать логику работы устройства вот такими скриптами.
Для отладки можно воспользоваться директивой :put в контрольных точках. К примеру не удалять, а просто вывести на экран объекты, чтобы проверить запрос. Так же не забывайте, когда используете переменные, что у них есть область видимости.
> :foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i list] "access-"]=0) do={:put $i}};
Раз уж мы затронули списки, то в следующий раз расскажу как эти списки можно держать в одинаковом состоянии на двух разных девайсах (к примеру для организации резервного шлюза в интернет).
Похожие статьи:
Метки: address, delete, find, list, mikrotik, network
Trackback from your site.
Comments (4)
Greek
| #
Вместо
:foreach i in [/ip firewall address-list find where list=access-inet] do={/ip firewall address-list remove $i};
удобнее сразу:
/ip firewall address-list remove [find where list=access-inet]
Reply
admin
| #
Да, спасибо — так действительно веселее выглядит.
Reply
eugene
| #
спасибо интересная статья, но эта конструкция ищет не вхождение строки с любого символа, а вхождение именно с начала, например:
при поиска строки abc в строке f.abc поиск ничего не находит.
Reply
admin
| #
Спасибо за отзыв 🙂
Для поиска вхождения подстроки, попробуйте воспользоваться оператором «~» вместо «=». В значении сравнения можно указывать POSIX регулярные выражения.
/ip route print where gateway~»^[0-9 \\.]*202″
Reply