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

    Функция возврата октета IP-адреса

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Функция возврата октета IP-адреса, RouterOS
     
    royalpublishing
    Guest
    #1
    0
    19.05.2014 22:02:00
    Использование: [$returnOctet <номер октета (0-3)>] Введите IP-адрес и аргумент от 0 до 3, чтобы вернуть конкретный номер октета:

    global returnOctet do={
       :if ($1="") do={
           :error "Вы не указали IP-адрес."
       }
       :if ($2="") do={
           :error "Вы не указали октет для возврата."
       }
       :if (($2>3) || ($2<0)) do={
           :error "Аргумент октета вне диапазона."
       }
       :local decimalPos "0"
       :local octet1
       :local octet2
       :local octet3
       :local octet4
       :set decimalPos [:find $1 "."]
       :set octet1 [:pick $1 0 $decimalPos]
       :set decimalPos ($decimalPos+1)
       :set octet2 [:pick $1 $decimalPos [:find $1 "." $decimalPos]]
       :set decimalPos ([:find $1 "." $decimalPos]+1)
       :set octet3 [:pick $1 $decimalPos [:find $1 "." $decimalPos]]
       :set decimalPos ([:find $1 "." $decimalPos]+1)
       :set octet4 [:pick $1 $decimalPos [:len $1]]
       :if (($octet1<0 || $octet1>255) || ($octet2<0 || $octet2>255) || ($octet3<0 || $octet3>255) || ($octet4<0 || $octet4>255)) do={
           :error "Октет вне диапазона."
       }
       :if ($2=0) do={
           :return $octet1
       }
       :if ($2=1) do={
           :return $octet2
       }
       :if ($2=2) do={
           :return $octet3
       }
       :if ($2=3) do={
           :return $octet4
       }
    }

    Я работаю на RouterOS 6.7. Когда я написал этот код, всё работало нормально, но после того, как я сделал из него функцию, не могу понять, почему, если вставить :put сразу после установки octet4, он показывает правильное значение, а с возвратом почему-то возвращается значение $octet3. Аргументы 0-2 дают ожидаемые результаты.
     
     
     
    royalpublishing
    Guest
    #2
    0
    13.06.2014 19:27:00
    Вот моя окончательная рабочая версия функции returnOctet. Я добавил возможность возвращать все октеты в виде массива. Использование: [$returnOctet <номер октета (0-4)>]. Введите IP-адрес и аргумент от 0 до 3, чтобы вернуть конкретный номер октета, или 4 — чтобы вернуть весь массив:

    :global returnOctet do={
     :if ($1="") do={ :error "Вы не указали IP-адрес."; }
     :if ($2="") do={ :error "Вы не указали номер октета для возвращения."; }
     :if (($2>"4") || ($2<"0")) do={ :error "Номер октета вне допустимого диапазона."; }
     :local decimalPos "0";
     :local octet1;
     :local octet2;
     :local octet3;
     :local octet4;
     :local octetArray;
     :set decimalPos [:find $1 "."];
     :set octet1 [:pick $1 0 $decimalPos];
     :set decimalPos ($decimalPos+1);
     :set octet2 [:pick $1 $decimalPos [:find $1 "." $decimalPos]];
     :set decimalPos ([:find $1 "." $decimalPos]+1);
     :set octet3 [:pick $1 $decimalPos [:find $1 "." $decimalPos]];
     :set decimalPos ([:find $1 "." $decimalPos]+1);
     :set octet4 [:pick $1 $decimalPos [:len $1]];
     :set octetArray [:toarray "$octet1,$octet2,$octet3,$octet4"];
     :if (($octet1<"0" || $octet1>"255") || ($octet2<"0" || $octet2>"255") || ($octet3<"0" || $octet3>"255") || ($octet4<"0" || $octet4>"255")) do={ :error "Октет вне допустимого диапазона."; }
     :if ($2="0") do={ :return $octet1; }
     :if ($2="1") do={ :return $octet2; }
     :if ($2="2") do={ :return $octet3; }
     :if ($2="3") do={ :return $octet4; }
     :if ($2="4") do={ :return $octetArray; }
    }
     
     
     
    rextended
    Guest
    #3
    0
    13.06.2014 20:53:00
    актуализировано: https://forum.mikrotik.com/viewtopic.php?f=9&t=85205&p=431507#p880374
     
     
     
    rviteri
    Guest
    #4
    0
    17.09.2014 03:45:00
    Как пользоваться этим скриптом?
     
     
     
    royalpublishing
    Guest
    #5
    0
    17.07.2015 20:42:00
    Очевидно, ответ запоздал примерно на год, но чтобы ответить на ваш вопрос: всё, что нужно — это скопировать и вставить указанный выше код ROS в ваш скрипт. Как указано в описании использования, вы можете вызвать его так внутри вашего скрипта:  
    :local ipAddress "10.1.1.20";  
    :put [$returnOctet $ipAddress 0];
    Это вернёт первый октет «10» и выведет его в окно терминала. Также, как отмечено выше, второй аргумент — числа от 0 до 3 — указывают, какой октет вы хотите получить. В приведённом примере, если указать цифры от 0 до 3, результатом будет «10», «1», «1» или «20» соответственно. Это очень удобно, когда нужно работать с определённым октетом переменной, содержащей IP-адрес.  

    Или можно напрямую передать IP в переменную, результат будет тот же, например:  
    :put [$returnOctet 10.1.1.20 0]

    После первого запуска скрипта, так как переменная глобальная, вы сможете вызывать её напрямую из терминала тем же способом или использовать в любом другом скрипте, если предварительно объявите «:global returnOctet;». Главное — не забыть это делать до использования, если вы не сбросили переменную командой «:set returnOctet;» или не перезагрузили роутер после запуска скрипта. Глобальные переменные не сохраняются после перезагрузки.  

    Чтобы запустить скрипт, есть несколько способов (возможно, их больше):  
    - открыть терминал и ввести «/system script run nameOfScript»  
    - или в Winbox зайти в System > Scripts > выбрать скрипт и нажать Run Script, но в этом случае вывод работать не будет.
     
     
     
    SiB
    Guest
    #6
    0
    14.06.2020 00:10:00
    Краткая версия: {
    local CurIP "192.168.10.0/24"
    put ("IP1oct: ".[pick $CurIP 0 [find $CurIP "."]])
    put ("IP2oct: ".[pick $CurIP 0 [find $CurIP "." ([find $CurIP "."]+1)]])
    put ("IP3oct: ".[pick $CurIP 0 [find $CurIP "." ([find $CurIP "." ([find $CurIP "."]+1)]+1)]])
    put ("IP4oct: ".[pick $CurIP 0 [find $CurIP "/" ]])
    }                                                  
    IP1oct: 192  
    IP2oct: 192.168  
    IP3oct: 192.168.10  
    IP4oct: 192.168.10.0  

    Пример: ip firewall connection remove [find connection-mark~“wan1_Orange<->LANs” src-address~$IP3oct]

    Редактировать после ответа @eworm: {  
    local CurIP "192.168.10.1/24"  
    local IPoct [pick $CurIP 0 [find $CurIP "/" ]]
    put ("IP1oct: ".($IPoct & 255.0.0.0))  
    put ("IP2oct: ".($IPoct & 255.255.0.0))  
    put ("IP3oct: ".($IPoct & 255.255.255.0))  
    put ("IP4oct: ".$IPoct)  
    }  
    IP1oct: 192.0.0.0  
    IP2oct: 192.168.0.0  
    IP3oct: 192.168.10.0  
    IP4oct: 192.168.10.1  

    Редактировать после ответа @eworm: {  
    local CurIP "192.168.10.1/24"  
    local IPoct [pick $CurIP 0 [find $CurIP "/" ]]
    put ("IP1oct: ". [tonum (($IPoct>>24)&0.0.0.255)] )
    put ("IP2oct: ". [tonum (($IPoct>>16)&0.0.0.255)] )
    put ("IP3oct: ". [tonum (($IPoct>>8)&0.0.0.255)] )
    put ("IP4oct: ". [tonum (($IPoct>>0)&0.0.0.255)] )
    }  
    IP1oct: 192  
    IP2oct: 168  
    IP3oct: 10  
    IP4oct: 1
     
     
     
    eworm
    Guest
    #7
    0
    15.06.2020 14:00:00
    RouterOS поддерживает побитовые операции, так что можно вычислять IP-адреса вот так, например, получить первый октет: :put (192.168.10.0 & 255.0.0.0)
    192.0.0.0 Возможно, это пригодится, чтобы ещё больше упростить ваши функции.
     
     
     
    CalEdu89
    Guest
    #8
    0
    13.09.2021 13:24:00
    Как мне на самом деле использовать этот скрипт после создания фильтра межсетевого экрана? Я только что его запустил, но столкнулся с некоторыми трудностями, поэтому так и не дошёл до того момента, когда он должен проверить DNS-чёрный список.
     
     
     
    SiB
    Guest
    #9
    0
    16.09.2021 22:04:00
    CalEdu89 пишет: Пожалуйста, создавайте новую тему на форуме и не поднимайте старые. Эта тема посвящена скриптам, а не решению проблем с DNS BlackList.
     
     
     
    rextended
    Guest
    #10
    0
    16.09.2021 23:08:00
    search tag # rextended ip2array ip split octet

    Эмм… Забыл этот скрипт… Актуальная версия всегда возвращает один массив с элементами:  
    0: IP, переданный в параметр  
    1: 1-й октет  
    2: 2-й октет  
    3: 3-й октет  
    4: 4-й октет  

    :global ip2array do={  
       :local ip [:toip $1]
       :local array [:toarray ""]
       :if ([:typeof $ip] != "ip") do={:return $array}
       :set ($array->0) $ip  
       :set ip [:tonum $ip]
       :set ($array->1) (($ip >> 24) & 255)  
       :set ($array->2) (($ip >> 16) & 255)  
       :set ($array->3) (($ip >>  8) & 255)  
       :set ($array->4) ( $ip        & 255)  
       :return $array  
    }

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