Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • 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
     
    el_berto
    Guest
    #1
    0
    30.04.2010 13:54:00
    Извините, не могу найти похожую тему. У меня есть переменная :global a 5; и я хочу увеличить/обновить её на заданный шаг (например, x = 5). Я использовал :global a ($a + 2); но теперь у меня a = 2, а не 7. Как это сделать?
     
     
     
    iking
    Guest
    #2
    0
    10.02.2023 21:55:00
    Привет! Для этого скрипта я хочу обновить новое значение так:

    :local b  
    :local c ""  
    :local b 50;  
    :set b ($b + 4);  
    :put [local $b];
    :local d ($b+3)

    /interface/wireguard set listen-port=($d+1) [find comment=$c];

    Мне не нужно видеть это в терминале, хочу сохранить это в скрипт как новое значение. Пожалуйста, помоги.
     
     
     
    rextended
    Guest
    #3
    0
    11.02.2023 10:48:00
    Объясни лучше, непонятно.
     
     
     
    iking
    Guest
    #4
    0
    11.02.2023 12:45:00
    На примере ниже:  
    :local a 5;  
    :set a ($a + 2);  
    :put $a;  

    в терминале просто выводится 7. Хорошо. Теперь я хочу, чтобы результат (например, 7) записывался в :local b, чтобы скрипт автоматически менялся на:  
    :local a 7;  
    :set a ($a + 2);  
    :put $a;  

    и чтобы каждый раз при запуске скрипта :local b обновлялся.
     
     
     
    rextended
    Guest
    #5
    0
    11.02.2023 12:54:00
    Я не понимаю, что ты хочешь сделать… :global b
    {
    :local a 5
    :set a ($a + 2)
    :set b ($a + $b)

    :put $a
    :put $b
    }
     
     
     
    iking
    Guest
    #6
    0
    11.02.2023 16:07:00
    Спасибо, этот код работает только при первом запуске, но если запустить его снова, переменная global b не изменяется. Я хочу, чтобы каждый раз, когда скрипт запускается, новое значение сохранялось в «b» и обновлялось. Например:

    :global b
    {
       :local a 5
       :set a ($a + 2)
       :set b ($a + $b)
       :put $a
       :put $b
    }

    При первом запуске скрипта b = 7, при втором запуске b = 9 и так далее...
     
     
     
    iking
    Guest
    #7
    0
    11.02.2023 17:06:00
    Я полагаю, команда :put просто выводит результат в терминал и не может обновить скрипт, так?
     
     
     
    Amm0
    Guest
    #8
    0
    11.02.2023 17:18:00
    Да, :put это показывает. Но переменные, объявленные через :local, исчезают, когда выходят из области видимости. Если использовать :global, это может помочь, пока вы не разберётесь с правилами области видимости.

    :global x 0  
    :set x ($x + 1)  
    :put $x  
    # выводит: 1  
    :set x ($x + 1)  
    :put $x  
    # выводит: 2
     
     
     
    iking
    Guest
    #9
    0
    11.02.2023 17:31:00
    Так что спасибо, на самом деле мне не нужно видеть результат. Я хочу, чтобы итоговое значение сохранялось в скрипте, и каждый раз при запуске скрипта это значение обновлялось. Например, когда изначально «b» равно 5, скрипт запускается, и «b» меняется на 7, то при следующем запуске скрипт должен брать для «b» уже значение 7 и так далее.
     
     
     
    Amm0
    Guest
    #10
    0
    11.02.2023 17:45:00
    Значение сохраняется в скрипте, и каждый раз при запуске скрипта оно обновляется. Вот почему нужно, чтобы ваша переменная была :global. Имейте в виду, что при этом она не сохраняется после перезагрузки, переменные хранятся в памяти. Например, $x будет иметь это значение для использования в других местах — :put (выводить в консоль) не обязательно. Если же вы используете “local”, переменная может выйти из области видимости (например, исчезнуть), что может ввести в заблуждение.

    Скобки { } создают область/блок, где живёт набор локальных переменных — поэтому, если вы изменяете и используете локальную переменную ВНУТРИ группы { } (то есть в той же области видимости), то увеличение/обновление работает отлично и с локальной переменной. Просто переменная пропадёт, когда дойдёт до конца блока кода, например до “}”.

    Поскольку глобальные переменные существуют между терминалами/сессиями (но не после перезагрузки), нужно аккуратно подбирать имена, чтобы они были уникальными.

    Кстати, мой $x — плохой пример для использования глобальных переменных, потому что, если другой скрипт использует $x, я буду менять его в вашем примере.
     
     
     
    Amm0
    Guest
    #11
    0
    11.02.2023 17:53:00
    Ещё одно замечание… Имя глобальной переменной должно быть задано, если вы используете скрипты доступа к переменным или терминал. Об этом рассказано здесь: https://wiki.mikrotik.com/wiki/Manual:Scripting_Tips_and_Tricks#Read_value_of_global_variable_defined_in_other_script
     
     
     
    iking
    Guest
    #12
    0
    11.02.2023 18:07:00
    Огромное спасибо за ваше время. Главная проблема такова: я использую VPS, который никогда не перезагружался, и создал туннель WireGuard. Моя страна заблокировала порты этого туннеля. Когда я изменил порт для прослушивания, WireGuard снова заработал. Теперь я не могу менять порт прослушивания в любое время — хочу, чтобы порт менялся автоматически. Я использую такой скрипт, когда туннель падает:

    :local c “”  
    :global b {  
     :local a 501  
     :set a ($a + 2)  
     :set b ($a + $b)  
     :put $a  
     :put $b  
    }  

    /interface/wireguard set listen-port=$b [find comment=$c];

    Когда туннель пропадает, скрипт автоматически меняет порт на 503. После нескольких сбоев туннеля скрипт уже не может снова изменить порт прослушивания. Если можно, помогите, пожалуйста. Спасибо.
     
     
     
    Amm0
    Guest
    #13
    0
    12.02.2023 16:56:00
    Думаю, тебе стоит опубликовать полный конфиг в НОВОМ посте... Но что-то вроде этого будет увеличивать номер порта на 2 каждый раз при запуске. Думаю, лучше сначала прочитать текущее значение с интерфейса, чтобы понять, что именно ты инкрементируешь.

    :global mywgname "<myWG>"
    {
     :local wginterface [/interface/wireguard/find comment=$mywgname]
     :local wgcurport [/interface/wireguard/get $wginterface listen-port]
     /interface/wireguard/set $wginterface listen-port=($wgcurport + 2)
    }
     
     
     
    iking
    Guest
    #14
    0
    12.02.2023 18:38:00
    Код отличный, но он работает только при первом запуске. При первом запуске берется порт для прослушивания, например, 119, и если порт падает, он меняет порт для прослушивания на 121. После этого порт поднимается, прошло 10 минут, и порт снова падает, зависая на 121. Вот так, спасибо.
     
     
     
    Amm0
    Guest
    #15
    0
    12.02.2023 18:49:00
    Трудно что-то понять без полного скрипта или какого-то контекста. Я просто привёл пример примерно — я не достаточно понимаю настройки WG, чтобы знать, правильно ли вообще менять этот код. Добавим логирование, чтобы отслеживать, что происходит:

    :global mywgname "<myWG>"
    {
     :local wginterface [/interface/wireguard/find comment=$mywgname]
     :local wgcurport [/interface/wireguard/get $wginterface listen-port]
     /log info "собираюсь обновить WG для $mywgname с id $wginterface, используя порт $wgcurport"
     /interface/wireguard/set $wginterface listen-port=($wgcurport + 2)
     :delay 1s
     :set wgcurport [/interface/wireguard/get $wginterface listen-port]
     /log info "обновил WG для $mywgname, теперь используем НОВЫЙ порт: $wgcurport"
    }
     
     
     
    iking
    Guest
    #16
    0
    12.02.2023 20:25:00
    На самом деле ты самый лучший парень, который действительно тратит своё время, чтобы помочь нам, так что огромное спасибо. В моей стране всё ОК, мой сервер тоже в порядке. Я не могу сделать WG-туннель с A на B, потому что WG заблокирован в моей стране на выход… Поэтому я поменял схему и сделал так, чтобы A выполнял роль игрового сервера для меня, и тогда туннель WG заработал! Порт прослушивания на локальном A — 80, пинг отличный. Порт прослушивания на B не имеет значения, там может быть любой. Но через несколько часов туннель падал, и я менял порт прослушивания на B — тогда туннель снова запускался! Этот цикл повторялся, пока я снова не изменил порт прослушивания на B. Теперь я хочу, чтобы это изменение происходило автоматически с помощью скрипта. Твой скрипт хорошо работает при первом падении: меняет порт прослушивания, и туннель снова запускается. Но если туннель падает снова, скрипт уже не меняет порт. Я использую твой скрипт в Netwatch при падении. Надеюсь, ты меня понял. Спасибо.

    :global mywgname “” {  
     :local wginterface [/interface/wireguard/find comment=$mywgname]
     :local wgcurport [/interface/wireguard/get $wginterface listen-port]
     /interface/wireguard/set $wginterface listen-port=($wgcurport + 2)  
    }
     
     
     
    Amm0
    Guest
    #17
    0
    12.02.2023 20:43:00
    @iking, ты можешь использовать схему на основе времени, где применяется /system/clock. Вот так, например, с 1000 плюс минуты: listen-port=(1000 +[:pick [/system/clock/get time] 3 5]). Лучше всего использовать NTP (или /ip/cloud для установки времени), тогда порт будет предсказуем с обеих сторон без необходимости сбрасывать начальные числа.

    Другой вариант — ZeroTier, хотя я честно не очень понимаю, как оно будет работать в твоём «национальном фаерволе»… ZeroTier автоматически решает много проблем с «фаерволами», включая смену портов и автоматическое уведомление об этом обеих сторон. Если маршрутизаторы из страны А и страны B будут в одной сети ZeroTier, тогда можно будет маршрутизировать через это соединение.

    Сколько национальный фаервол блокирует соединения с внутренними ZeroTier «лунами» или «корнями» — не знаю. Если на стороне с открытым фаерволом больше узлов, это может быть более надёжно и удобно — туннелировать с «ограниченной» стороны. Так что это ещё одна идея для проверки. Конечно, немного посложнее.
     
     
     
    iking
    Guest
    #18
    0
    12.02.2023 20:55:00
    Моя страна очень далеко от моего роутера, который находится в Германии и ничего не блокирует, моя страна использует китайский GFW. Когда я создаю WG-туннель и назначаю IP 192.100.100.1/30 со стороны Германии и 192.100.100.2/30 со стороны моей страны, пинг проходит и всё работает хорошо. Я создал NetWch, чтобы проверить, что 192.100.100.2 недоступен в локации A, и запустил ваш скрипт с интервалом 00:00:10. WG запущен и работает, но после некоторого времени туннель падает, NetWch запускает скрипт в месте с падением, меняет порт, WG снова запускается и снова работает. После нескольких падений WG и сейчас NetWch должен снова запустить скрипт и изменить порт, но уже не работает. Вот именно в этом моя проблема. Спасибо.
     
     
     
    iking
    Guest
    #19
    0
    13.02.2023 14:29:00
    Я тут новое придумал! Когда отключаешь netwatch и потом включаешь снова, скрипт срабатывает и меняет listen-port. Поэтому я слегка подправил код:

    :global mywgname “” {
     :local wginterface [/interface/wireguard/find comment=$mywgname]
     :local wgcurport [/interface/wireguard/get $wginterface listen-port]
     /interface/wireguard/set $wginterface listen-port=($wgcurport + 2)
    }

    {
     /tool/netwatch/disable [find comment=“”]
     :delay 10s
     /tool/netwatch/enable [find comment=“”]
     :delay 5s
    }

    У тебя есть идея получше?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры