Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Постоянные переменные окружения

    Постоянные переменные окружения

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Постоянные переменные окружения, RouterOS
     
    BrianHiggins
    Guest
    #1
    0
    09.12.2020 16:47:00
    Кроме как загружать их скриптом при каждом перезагрузке, есть ли способ, чтобы переменная окружения сохранялась между перезагрузками?
     
     
     
    Larsa
    Guest
    #2
    0
    02.10.2021 17:39:00
    Есть какие-то новости по поводу постоянных переменных в версии v7?
     
     
     
    Larsa
    Guest
    #3
    0
    03.10.2021 06:38:00
    Ходят слухи, что версия 7.9 также будет включать возможность перехватывать хорошо задокументированные коды и сообщения об ошибках.
     
     
     
    rextended
    Guest
    #4
    0
    09.05.2022 10:11:00
    Обновлено для лучшей поддержки переменных ID, кода и функций, протестировано на версиях v6 и v7.
     
     
     
    eldoncito2019
    Guest
    #5
    0
    10.05.2022 16:23:00
    Твой скрипт отлично работает, друг REX, только вот как его можно убрать из ЛОГА, чтобы он не сохранялся каждый раз, когда переменные сохраняются в LAYER 7 EL DONCITO?
     
     
     
    rextended
    Guest
    #6
    0
    10.05.2022 17:22:00
    Ты не сможешь без отключения всех логов.
     
     
     
    eldoncito2019
    Guest
    #7
    0
    10.05.2022 19:54:00
    окей. EL DONCITO.
     
     
     
    diamuxin
    Guest
    #8
    0
    16.05.2022 15:26:00
    Очень полезный скрипт, спасибо! С уважением.
     
     
     
    rextended
    Guest
    #9
    0
    16.05.2022 15:53:00
    Огромное спасибо! Загляните также в мою подпись — там есть другие скрипты, которые я ещё не занёс в каталог… когда-нибудь…
     
     
     
    rextended
    Guest
    #10
    0
    03.10.2021 00:27:00
    Извините, но, думаю, это не представляет интереса для MikroTik до выхода стабильной версии RouterOS 7.7.7.
     
     
     
    liuyao
    Guest
    #11
    0
    30.01.2021 09:09:00
    у меня есть способ настроить расписание, чтобы каждую минуту считывать переменные окружения в массив. Определение второго запуска происходит начиная с начала расписания. Полученный массив можно использовать для записи во второе расписание в любое время. Возможно, идея в том, чтобы сделать это самостоятельно. Есть только одна команда для демонстрации: :put [/system script environment print as-value]
     
     
     
    Jotne
    Guest
    #12
    0
    30.01.2021 11:12:00
    OP не хотел скрипт или использование планировщика. Я согласен, что должен быть способ задать постоянные переменные, которые сохраняются после перезагрузки. Правило фаервола сохраняется после перезагрузки, значит, и постоянная переменная тоже должна так работать.
     
     
     
    millenium7
    Guest
    #13
    0
    08.02.2021 04:17:00
    Пока что можно вроде как обойтись, храня переменные в комментариях. Область layer7-protocol — неплохое место, потому что сейчас она практически не используется, так что если туда положить кучу переменных, интерфейс не заблудится. Комментарии не умеют корректно хранить массивы, точнее команда 'toarray', которая конвертирует строку обратно в массив, не работает, потому что массивы хранятся с разделителями в виде точек с запятой, а команда 'toarray' использует запятые (ну почему, Mikrotik, почему?). Но этот способ отлично подходит для более простых вещей. Я использую его, чтобы увеличивать счётчик в нескольких скриптах. Один из них — шаблон, который запускается позже, например, когда роутеру говорят поменять какую-то конфигурацию и потом перезагрузиться. Первая команда здесь — увеличить целочисленный счётчик в комментарии к этой запланированной задаче, потом его читают, и если счётчик больше единицы, значит что-то пошло не так — команды не выполнились, скрипт сломался, не удалился сам (иначе роутер будет перезагружаться каждый день в 3 ночи бесконечно), и тогда он отправляет письмо в службу поддержки, а ещё сообщение в удалённый syslog, чтобы предупредить, что что-то не так и нужна ручная проверка.
     
     
     
    rextended
    Guest
    #14
    0
    02.10.2021 10:30:00
    поиск по тегу #rextended сохранение и восстановление глобальных переменных при перезагрузке

    Это для сохранения и восстановления переменных с сохранением правильного типа данных при восстановлении:

    Запланированный скрипт выполняет это каждые x минут, намеренно сохраняя только переменные, но не коды или функции, потому что пока я не нашёл способ сделать это.

    code = из функции “:parse”, например:  
    global c [:parse “/interface print”]

    function = создаётся как  
    global f do={ /interface print }, но определяется как массив (:typeof)

    Экспортируются только простые массивы, не работают массивы массивов и более сложные структуры данных.

    /system script environment  
    :foreach item in=[find] do={
       :local vname  [get $item name]
       :local vvalue [get $item value]
       :if ($vvalue~"^\\*") do={:set vvalue "ID$vvalue"}  
       :if ($vvalue~"^(\\(code\\)|;\?\\(eva\?l )") do={:set vvalue "(code)"}  
       /ip firewall layer7  
       remove [find where name=$vname]
       add name=$vname comment="$vvalue"  
       :delay 10ms  
       :execute "/ip firewall layer7 set [find where name=$vname] regexp=[:typeof \$$vname]"
       :if ($vvalue="(code)") do={:delay 10ms ; set [find where name=$vname] regexp="code"}
    }

    Сохраняет имя переменной в name, тип переменной в regexp, содержимое переменной в comment.

    При перезагрузке этот скрипт запускается автоматически и восстанавливает даже переменные, которые содержат нечитаемые данные — бинарные данные, маленькие числа и спецсимволы:

    /ip firewall layer7  
    :foreach item in=[find where regexp~"^(array|bool|code|id|ip|ip-prefix|ip6|ip6-prefix|lookup|nil|nothing|num|str|time)\$"] do={
       :local vname  [get $item name]
       :local vvalue [get $item comment]
       :local vtype  [get $item regexp]
       /system script environment  
       remove [find where name=$vname]
       :if ($vtype~"^(array|ip|ip6|num|str|time)\$") do={  
           :execute ":global $vname [:to$vtype [/ip firewall layer7 get [find where name=$vname] comment]]"
       } else={  
           :if ($vtype~"^(bool|id|ip-prefix|ip6-prefix|lookup|nil|nothing)\$") do={  
               :if ($vtype="bool")         do={:execute ":global $vname [:tobool $vvalue]"}
               :if ($vtype="id")           do={:execute ":global $vname [:toid $[:pick $vvalue [:find $vvalue "*" -1] [:len $vvalue]]]"}
               :if (($vtype="ip-prefix") or \
                    ($vtype="ip6-prefix")) do={:execute ":global $vname [[:parse \":return $vvalue\"]]"}
               :if ($vtype="lookup")       do={:execute ":global $vname \"\$$vname\""}  
               :if ($vtype="nil")          do={:execute ":global $vname"}  
               :if ($vtype="nothing")      do={:execute ":global $vname [:nothing]"}
           } else={  
               # vtype="code"  
               :log error "Неизвестная переменная >$vname< типа >$vtype<"  
               :execute ":global $vname [/ip firewall layer7 get [find where name=$vname] comment]"
           }  
       }  
       :delay 10ms  
    }

    Правила уровня 7 для Firewall остаются нетронутыми, если их regexp — ровно одно слово из списка зарезервированных типов переменных.  

    Кто-нибудь знает полный список типов переменных???

    стандартные: array bool id ip ip6 num str time  
    сломанные, но восстанавливаемые с помощью хака: ip-prefix ip6-prefix  
    не восстанавливаемые: code function (определяются как массив)  
    “неопределённые” типы: nil nothing lookup ($0 для функций)  

    Скрипт не доработан для неизвестных типов данных, обнаруженных мной в 2023: https://forum.mikrotik.com/viewtopic.php?p=1014223#p1014223  
    apireq (api request), exclamation, cmd, iterator, backreference  

    ИЗМЕНЕНИЕ: добавлена фиксация для нового “op” в RouterOS, спасибо @tabraham  
    ОБНОВЛЕНИЕ 2025: добавлены отсутствующие типы, обнаруженные в 2023 году
     
     
     
    Sertik
    Guest
    #15
    0
    31.05.2022 07:46:00
    Спасибо автору за очень красиво написанные скрипты для сохранения и восстановления глобальных переменных. Есть комментарии: в скрипте сохранения нужно убрать сохранение «(function)», потому что код функции восстановить не получится. Сохранять и восстанавливать нужно только переменные. При восстановлении у меня не работает восстановление булевых переменных через :execute — все булевые восстанавливаются как nil (без значений). Пришлось вставить такую проверку и восстанавливать через :parse:  
    if ($vtype = "bool") do={  
    [[:parse ":global $vname [:to$vtype $[/ip firewall layer7 get [find where name=$vname] regexp]]"]]}
    В таком виде всё работает.  
    Ещё нужно убрать из скрипта восстановления строку:  
    if ($vvalue = "(function)") do={:set vtype "function" }  
    потому что функции не сохраняются и их восстанавливать не нужно — их придётся определять заново.
     
     
     
    rextended
    Guest
    #16
    0
    31.05.2022 12:22:00
    Да, это баг, но решается просто так: if ($vtype="bool") do={:execute ":global $vname [:tobool $vvalue]"}. Спасибо за информацию, я немного переделал и также исправил булевы значения. Что касается “(function)” (и CODE!) — это было добавлено не просто так: чтобы по возможности обрабатывать все типы, в будущем, возможно, их можно будет обрабатывать напрямую. Уже теперь готово добавление скрипта, который при запуске ищет файл в (flash/)functions/vname.rsc или (flash/)codes/vname.rsc и загружает его, если файл существует… Таким образом, коды и функции тоже восстанавливаются. Но не предполагается хранить в самом файле код “(eval /interface print)”, потому что даже если его и восстановить, получится только строка — на текущий момент нет способа напрямую преобразовать “(eval /interface print)” в код или функцию.
     
     
     
    Sertik
    Guest
    #17
    0
    31.05.2022 13:37:00
    Всё понятно. Но если сохранить переменную функции, например, как (function), то при последующем восстановлении код активных функций в окружении будет повреждён, и их придётся переопределять. Если же функции не сохранять, то и восстанавливать их не нужно — тогда код активных функций окружения сохранится и будет работать после восстановления глобальных переменных других типов.
     
     
     
    rextended
    Guest
    #18
    0
    31.05.2022 14:38:00
    Ты что-то забыл: это для восстановления переменных при перезагрузке, а не в любое произвольное время… При перезагрузке никаких предыдущих переменных, функций или кода не существует… И смотри пункт 3) в предыдущем сообщении…
     
     
     
    Sertik
    Guest
    #19
    0
    01.06.2022 07:56:00
    Я не забыл, твой скрипт удобен не только для сохранения и восстановления переменных при перезагрузке, но и в любой другой момент!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры