Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • 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
    Добавить значения VLAN моста

    Добавить значения VLAN моста

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Добавить значения VLAN моста, RouterOS
     
    pcunite
    Guest
    #1
    0
    19.02.2021 04:12:00
    Я пытаюсь задать некоторые значения в команде /interface bridge vlan, а именно свойство untagged. Обычно я делаю это так: set bridge=BR1 tagged=ether4 [find vlan-ids=10]. Но теперь мне нужно как-то добавить значение к уже существующему. Вот что у меня получилось на данный момент, но работает это неправильно. Ниже приведён полный пример.

    Пример:  
    # Настройка скрипта  
    /interface bridge add name=BR1 protocol-mode=none vlan-filtering=no  
    /interface bridge vlan  
    add bridge=BR1 untagged=ether2 vlan-ids=10  

    # Как добавить "ether4" к массиву?  
    set bridge=BR1 untagged=([get value-name=untagged]",ether4") [find vlan-ids=10]
     
     
     
    Amm0
    Guest
    #2
    0
    31.01.2025 16:50:00
    LOL. Похоже, за последние 3 года мало кто пытался написать скрипт для существующих trunk-портов моста… Проблема в том, что атрибут vlan-ids в /interface/bridge/vlan — это МАССИВ, поэтому [find vlan-ids=10] не работает с массивом. Я надеялся, что что-то упустил, но поиск в Google и на форуме ничего не подсказал. Зато, по крайней мере с версии 7.16, access-порты можно автоматически обрабатывать с помощью «динамических» записей, создаваемых /interface/vlan и установки pvid= на /interface/bridge/port — так что эта часть стала проще (добавление L3 /interface/vlan на vlan-бридж автоматически добавит bridged в динамический tagged=), то есть одна правка стала лишней.

    Но скрипт для «добавления tagged-порта» далеко не простой, и я всё ещё над ним работаю... Вот как я сюда и попал. Я пытался создавать «автоматизированные» скрипты для VLAN на мосту (см. часть 1: http://forum.mikrotik.com/t/example-of-automating-vlan-creation-removal-inspecting-using-mkvlan-friends/181480/6), а часть 2 со скриптами для управления «bridge vlan filtering» — куда сложнее.  

    Единственный способ, который я нашёл, — это сложный код, который перебирает «dynamic=no» в /interface/bridge/vlans, затем с помощью foreach перебирает массив vlan-ids, чтобы проверить совпадения с искомым VLAN, и тогда делает SET (если совпадений нет — после двух циклов делает ADD нового /interface/bridge/vlan). Если кто-то знает способ получше или хитрость — очень интересно было бы узнать.
     
     
     
    optio
    Guest
    #3
    0
    31.01.2025 17:49:00
    Возможно, это поможет: [find dynamic=no vlan-ids=[:if ([:len [:find $"vlan-ids" <VLAN_ID>]]) do={:return $"vlan-ids"}]] или с функцией для повторного использования: :local inArray do={:if ([:len [:find $1 $2]]) do={:return $1}}
    ... [find dynamic=no vlan-ids=[$inArray $"vlan-ids" <VLAN_ID>]]
     
     
     
    Amm0
    Guest
    #4
    0
    31.01.2025 19:32:00
    LOL, я думал, что какой-то трюк с [find (code)] сработает — проблема была именно в вложенном :find внутри find, о котором я не подумал. Отличная работа! Теперь, стоит ли "языку конфигурации" для роутера превращать добавление access/trunk-портов в задачу уровня LeetCode — это уже совсем другой вопрос. По моему мнению, нужен оператор find для проверки вхождения в массив, типа “[find vlan-id has <VLAN_ID>]”. Сейчас есть оператор “in”, но он работает только для ip-prefix. Например, даже с ярлыком @optio всё не очень аккуратно, а удаление ещё сложнее. Думаю, вот такой подход с тегированием порта на VLAN — без тонны :foreach — правильный, но надо бы подробнее протестировать, чтобы быть уверенным:

    :global mktrunk do={
       :local bvid [/interface/bridge/vlan find dynamic=no vlan-ids=[:if ([:len [:find $"vlan-ids" $1]]) do={:return $"vlan-ids"}]]
       :if ([:len $bvid]=0) do={
           :set bvid [/interface/bridge/vlan add vlan-ids=$1 comment="added by $0" bridge=[/interface/bridge/find vlan-filtering=yes disabled=no]]
       }
       /interface/bridge/vlan set $bvid tagged=([get $bvid tagged],$2)
    }

    :global rmtrunk do={
       :local bvid [/interface/bridge/vlan find dynamic=no vlan-ids=[:if ([:len [:find $"vlan-ids" $1]]) do={:return $"vlan-ids"}]]
       :local orig [/interface/bridge/vlan get $bvid tagged]
       :local final [:toarray ""]
       :foreach i in=$orig do={ :if ($i != "$2") do={:set final ($final, $i)} }
       /interface/bridge/vlan set $bvid tagged=$final
       # опционально, если больше нет тегированных или нетегированных портов — удалить сам bridge vlan
       :if (([:len [/interface/bridge/vlan get $bvid tagged]]=0) and ([:len [/interface/bridge/vlan get $bvid untagged]]=0)) do={
           /interface/bridge/vlan remove $bvid
       }
       # в то время как mktrunk может принимать массив интерфейсов, rmtrunk должен получать только один интерфейс в $2
    }

    # создать
    $mktrunk 123 ether4
    # обновить
    $mktrunk 123 ether5
    # удалить
    $rmtrunk 123 ether5
    # примечание: массив поддерживается только для mktrunk, так как там это автоматом
    $mktrunk 123 ("ether5","ether6")
    # а rmtrunk МАССИВ не принимает и вообще ничего не найдёт/не удалит

    В любом случае, вышеприведённый код намного чище, чем то, с чего я начинал… Так что спасибо!
     
     
     
    optio
    Guest
    #5
    0
    31.01.2025 19:46:00
    Используй функцию (глобальную или передаваемую как аргумент другой функции) для повторного использования в команде find, вместо того чтобы копировать и вставлять один и тот же код в рабочие функции, но я согласен, что какой-нибудь дополнительный оператор (например, or, который бы работал и с массивами) для поиска значения в массиве был бы намного чище. 1337-код здесь нужен, чтобы обмануть интерпретатор и получить значение переменной из контекста, когда она не определена в коде и в имени есть дефис — $“”. Для удаления VLAN пока не вижу простого способа, кроме как отфильтровать массив VLAN ID по тегам и убрать из него нужный VLAN ID.
     
     
     
    1024jon
    Guest
    #6
    0
    27.04.2025 21:07:00
    Не уверен, что это то, о чем ты говоришь, но я искал способ добавить порты моста в существующую VLAN через CLI.

    :local vlanId 30  
    :local bridgeName "bridge"  
    :local newPort "sfp-sfpplus3"  

    :local vlanEntry [/interface bridge vlan find where bridge=$bridgeName and vlan-ids=$vlanId]

    :local currentTagged [/interface bridge vlan get $vlanEntry tagged]
    :put [:len $currentTagged]

    :if ([:len $currentTagged] > 0) do={
       :local updatedTagged ($currentTagged, $newPort)  
       /interface bridge vlan set $vlanEntry tagged=$updatedTagged  
    } else={  
       /interface bridge vlan set $vlanEntry tagged=$newPort  
    }  

    :put ("Порт " . $newPort . " добавлен в VLAN " . $vlanId . " как tagged.")
     
     
     
    Amm0
    Guest
    #7
    0
    29.04.2025 20:33:00
    Это сработает только в том случае, если VLAN уже существует в /interface/bridge/vlan. Сейчас у вас будет запись bridge vlan, если у вас уже был /interface/vlan в 7.16+, так как он создаётся динамически. В противном случае нужно использовать «add», а не «set».
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры