У системі RouterOS передбачена можливість створення та виконання довільних скриптів мовою RouterOS Scripting, яким відведено спеціальний розділ /system script. Розділ включає три директорії:
- ./script - директорія для зберігання файлів скриптів
- ./job - директорія для відображення скриптів, що виконуються в даний момент
- ./environment - директорія з відображенням змінних оточення
Scripting language manual //help.mikrotik.com
РОУТЕР MIKROTIK ИГРАЕТ ГИМН УКРАИНЫ //soapbubble.co.ua
Основы
Скрипт RouterOS - это текст, состоящий из командных строк. Командные строки выполняются одна за другой до конца скрипта или до возникновения ошибки выполнения.
Комментарии #
Комментарий использует всю строку, которая начинается с символа #, перед которым не допускается никаких символов, в том числе пробелов и табуляций.
Командная строка
Консоль RouterOS использует следующий синтаксис команды:
[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]
- [префикс] – символ ":" или "/", указывающий, является ли команда ICE или путем. Это может не потребоваться
- [путь] - относительный путь к нужному уровню меню. Это может не потребоваться.
- команда – одна из команд, доступных на указанном уровне меню
- [uparam] - безымянный параметр, должен быть указан, если команда этого требует
- [params] - последовательность именованных параметров, за которыми следуют соответствующие значения Конец командной строки представлен токеном ";" или NEWLINE. Иногда ";" или NEWLINE не требуется для завершения командной строки.
Командная строка может использоваться внутри другой командной строки для этого ее помещают в квадратные скобки [ ]
!!!
ограничителями в грамматике служат токены ( ), [ ], { }, :, ;, $, /.
Пробелы используются для разделения токенов. Пробел необходим между двумя токенами только если их объединение может быть интерпретировано, как другой токен.
Использования пробелов следует избегать там, где они не требуются, а в некоторых конструкциях они недопустимы, например перед =.
!!!Команды
Команда начинается символом : или / и заканчивается символом ;. Команда использует строку целиком, а если команда разбита на несколько строк, в конце предшествующей строки используется соединительный символ \.
Многие команды используют параметры, которые следуют за именем команды.
Для каскадного использования команды в параметре другой команды ее обрамляют квадратными скобками [ и ], допускает только одну командную строку.
Области скрипта
По умолчанию скрипт образует глобальную область, в которой могут находится любые команды. Фигурными скобками { и } можно выделять локальные области любой глубины вложенности, которые тоже могут содержать любые команды.
Переменные
Переменная - это именованная область данных, значение которой доступно для команд скрипта. Правила определения имени:
- IPv4 - могут включать буквы и цифры
- "br-local" - могут включить знаки и другие символы в двойных кавычках
- vAR - чувствительны к регистру
Переменные не требуют типизации, но значения переменных могут принадлежать типам:
- num - 64 битное знаковое целое. может быть инициализировано шестнадцатиричным значением
- bool - булев тип. может быть true или false
- str - строковый тип. последовательность символов
- ip - IP адрес
- ip6-prefix - IPv6 префикс
- id - шестнадцатиричное значение с префиксом *. Каждая позиция меню имеет уникальный внутрений ID
- time - дата и время
- array - последовательность значений, массив
- nil - тип переменной по умолчанию, если она не инициализирована никаким значением
Предельно допустимый размер данных переменной 4096 Byte.
Переменные могут быть глобальными и локальными, в зависимости от области декларирования и команды :global или :local. Попытка декларировать глобальную переменную в локальной области приведет к ошибке.
Значение переменной устанавливается командой :set из константы, выражения или значения другой переменной. Команда :set без значения отменяет декларацию переменной и делает ее недоступной.
Команда :put выводит значения переменной в консоль.
///
Ключевые слова
Ключевые слова являются не могут использоваться в качестве имен переменных и функций:
- and -
- or -
- in -
Операторы
Конструкции
Возврат :return
Условие
//
:if(<condition>) do={<commands>} else={<commands>} <expression>
Цикл
//
выполнять команды до тех пор, пока не будет выполнено заданное условие
:do { <commands> } while=( <conditions> );
:while ( <conditions> ) do={ <commands> };
//
:for <var> from=<int> to=<int> step=<int> do={ <commands> }
//
:foreach <var> in=<array> do={ <commands> };
//
Команды
//wiki.mikrotik.com/wiki/Manual:Scripting#Global_commands
//
:log <topic> <message> записывает сообщение в системный журнал log
- topics тема сообщения из: debug, error, info или warning
- message текст сообщения допускает ascii и кириллицу, и может быть выражением
12:local myid [/system identity get name]:log info ("Router Identity: " . $myid)
:delay <time> приостанавливает выполнение скрипта на заданное время
- <time> продолжительность остановки в миллисекундах (включает суффикс ms)
:beep <freq> <length> активирует звуковой сигнал из встроенного динамика
- <freq> частота сигнала в Hz
- <length> продолжительность сигнала в миллисекундах (включает суффикс ms) не связана с длительностью выполнение самой команды, поэтому последовательность команд :beep должна чередоваться с командами :delay
12345:beep frequency=523 length=500ms;:delay 500ms;:beep frequency=659 length=500ms;:delay 500ms;:beep frequency=784 length=1000ms;
Примеры
Пример управление интерфейсом hide-me-sstp, который отключается на 60 секунд, а затем включается:
1 2 3 4 5 |
:log info "refreshing hide-me-sstp connection" /interface disable hide-me-sstp :delay 60000ms :log info "enabling hide-me-sstp" /interface enable hide-me-sstp |
//
1 2 3 4 |
/interface ethernet set isp disabled=no /interface ethernet enable isp /interface enable isp /interface bridge disable guest-wifi |
/interface enable hide-me-sstp
1 2 |
:if ([/interface get hide-me-sstp running]=false) \ do={[/interface enable hide-me-sstp]} |
Куча
/interface set hide-me-sstp disabled=yes
/ip firewall connection print without-paging
/interface print without-paging
/interface print count-only
:beep frequency=1760 length=100ms;
/interface find type=sstp-out
/interface get number=15
/ip route disable [find dst-address=0.0.0.0/0 gateway=xx.xx.xx.xx]
:log error "ISP2 is down"
:delay 4000 ms
/ip firewall connection remove [find]
!!! MikroTik: Как отключить (включить) интерфейс по расписанию https://mhelp.pro/ru/mikrotik-kak-otklyuchit-vklyuchit-interfeys-po-raspisaniyu/
!!! Авторский: Aleksov's Blog / Софт / RouterOS //blog.set-pro.net
!!! Удалённое включение скриптов Mikrotik из Telegram v 2.0 https://habr.com/ru/post/482802/
!!! Mikrotik Scripts: sending power on notification to Telegram https://mhelp.pro/mikrotik-scripts-sending-power-on-notification-to-telegram/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Func: Telegram send message :local TGSendMessage do={ :local tgUrl "https://api.telegram.org/bot$Token/sendMessage?chat_id=$ChatID&text=$Text&parse_mode=html"; /tool fetch http-method=get url=$tgUrl keep-result=no; } # Constants :global RebootStatus; :local TelegramBotToken "987654321:AAFJIVTAWodBwzGX2CLne6-PK4RFNSy-8OY"; :local TelegramChatID "987654321"; :local DeviceName [/system identity get name]; :local TelegramMessageText "\F0\9F\9F\A2 <b>$DeviceName:</b> start after Power Off."; # Program :if ($RebootStatus != true) do={ $TGSendMessage Token=$TelegramBotToken ChatID=$TelegramChatID Text=$TelegramMessageText; :set RebootStatus true; :log info "Script CheckPowerOn send Telegram message." } |
Виконання скриптів
Выполнение скриптов возможно двумя способами:
- в терминале командой /system script run <script>
- в разделе скриптов System>Scripts скрипты могут создаваться и выполнять вручную или другими скриптами
- в планировщике System>Scheduler скрипты выполняются по заданному расписанию
Політики /Policy
Для успешного выполнение скрипта действия команд скрипта не должны превышать установленные для скрипта политики Policy. Политики скриптов сходны и частично совпадают с пользовательскими, которые позволяют:
- ftp
- reboot выполнить перезагрузку
- read читать значения настроек
- write изменять настройки
- policy управлять учетными записями и группами
- test запуск инструментов (ping, traceroute, bandwidth-test, wireless scan, snooper)
- password менять пароль учетной записи
- sniff исполнение встроенного аналога tcpdump (tools → sniffer)
- sensitive обрабатывать чувствительные данные, как ключи Wi-Fi, IPSec, SNMP, пароли VPN-интерфейсов и серверов, пароли протоколов маршрутизации, а также создавать архивы, которые содержат чувствительные данные
- romon
- dude
Отмена требований политики /dont-require-permissions
Для скрипта в репозитории доступно свойство dont-require-permissions, которого нет у скриптов планировщика. Свойство dont-require-permissions с установленным значением =yes позволяет любому, у кого нет соответствующих разрешений, выполнять скрипт. Например, если в скрипте есть политики read, write, test, sensitive, но у пользователя или приложения, выполняющего сценарий, меньше (например, read, write) то установка dont-require-permissions=yes позволит все равно запустить скрипт. Это потенциально может позволить изменить конфиденциальную информацию с помощью скрипта, даже если у пользователя нет достаточных разрешений.
Терминал
Скрипты и задания планировщика с многострочными скриптами можно создать в окне терминала. Для этого:
- скрипт заключается в кавычки "..."
- если в скрипте есть кавычки, их следует маскировать \"
- отдельные строки скрипта следует разделить \r\n
Пример создание в Scheduler нового задания:
1 |
/system scheduler add name=demo-task start-date=jan/1/2023 start-time=04:00:00 interval=1d policy=read,write,test on-event=":log info \"refreshing hide-me-sstp connection\"\r\n/interface disable hide-me-sstp\r\n:delay 60000ms\r\n/interface enable hide-me-sstp" |
Джерела
Scripting language manual //help.mikrotik.com
Manual:Scripting //wiki.mikrotik.com
- Руководство по языку скриптов (любительский перевод с некритическими ошибками) //blog.telecom-sales.ru
Manual:Scripting Tips and Tricks //wiki.mikrotik.com
Scripts (коллекция готовых скриптов по разделам: ) //wiki.mikrotik.com
Авторский: Aleksov's Blog / Софт / RouterOS //blog.set-pro.net
Написание скриптов для RouterOS //blog.telecom-sales.ru
MikroTik Скрипт: Уведомление о успешном входе на устройство или простой парсер журнала MikroTik //habr.com (9.12.2020)
Писать скрипты для Mikrotik RouterOS — это просто //habr.com (31.10.2014)
SPW