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

    Добавить или удалить адрес из списка API

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Добавить или удалить адрес из списка API, RouterOS
     
    veezy
    Guest
    #1
    0
    27.07.2010 16:08:00
    Всем привет! С помощью этого API-запроса я добавляю IP в address-list на своем роутере: /ip/firewall/address-list/add =list=kesik =address=1.2.3.4 =disabled=no, но не могу удалить его через API. Может кто-нибудь помочь, как правильно отправить эту команду через API? /ip firewall address-list remove [/ip firewall/address-list find address=1.2.3.4] Я пробовал много раз, но так и не получается. Спасибо!
     
     
     
    strg
    Guest
    #2
    0
    29.11.2011 14:43:00
    А что насчёт команды ниже? /ip firewall address-list remove [/ip firewall address-list find list=ssh-accept]
     
     
     
    Chupaka
    Guest
    #3
    0
    29.11.2011 16:01:00
    Дай угадаю… просто замени ?address=1.2.3.4 на ?list=ssh-accept?
     
     
     
    boen_robot
    Guest
    #4
    0
    29.11.2011 17:16:00
    Если нужно указать несколько записей, можно перечислить все ID через запятую. Не уверен, поддерживает ли это =.id=, но последние данные говорят, что =numbers= точно поддерживает.
     
     
     
    strg
    Guest
    #5
    0
    29.11.2011 17:43:00
    Я получаю ошибку: !trap=message=unknown parameter. Мой код такой:  
    mikrotik.Send("/ip/firewall/address-list/print");  
    mikrotik.Send("?list=ssh-accept");  
    mikrotik.Send("=.proplist=.id");  

    mikrotik.Send("/ip/firewall/address-list/remove");  
    mikrotik.Send("=.id=");
     
     
     
    boen_robot
    Guest
    #6
    0
    29.11.2011 19:02:00
    Вам действительно нужно сохранить ID в переменную (используя метод Read() и правильно проанализировав возвращённые данные), а затем добавить полученный ID в следующую команду. А вы вместо этого просто отправляете команду печати, а потом команду удаления, которая не содержит нужный ID для удаления. К тому же C# клиент из вики… ну просто ужас… Вы не рассматривали вариант использовать mikrotik4net (C# клиент из раздела «elsewhere»)?
     
     
     
    stimels
    Guest
    #7
    0
    23.09.2012 05:44:00
    хм… у меня есть массив с IP, которые нужно удалить из списка адресов $ros_list=mylist;  
    foreach ($removeiparray as $remove)  
    {  
    echo "Удаляем IP: " . $remove . "\n";  

    $API->write("/ip/firewall/address-list/print", false);  
    $API->write("?list=$ros_list", false);  
    $API->write("?address=$remove", false);  
    $API->write("=.proplist=.id");  
    $READ = $API->read();  
    $i=0;  
    foreach ($READ as $x) {  
       $line = $READ[$i];
       $id = $line['.id'];
       sleep(1);  
       $API->write("/ip/firewall/address-list/remove", false);  
       $API->write("=.id=$id", true);  
       $i++;  
    #    usleep(5000);  
    }}}  

    я создал IP - 2.2.2.2, в отладке вижу:  
    Удаляем следующий IP: 2.2.2.2  
    <<< [31] /ip/firewall/address-list/print
    <<< [14] ?list=mylist
    <<< [16] ?address=2.2.2.2
    <<< [14] =.proplist=.id
    >>> [3/3] байт прочитано.
    >>> [3, 19]!re
    >>> [10/10] байт прочитано.
    >>> [10, 8]=.id=*1ED6
    >>> [5/5] байт прочитано.
    >>> [5, 1]!done
    <<< [32] /ip/firewall/address-list/remove
    <<< [10] =.id=*1ED6
    Отключился… Но он всё равно остаётся в списке адресов.
     
     
     
    boen_robot
    Guest
    #8
    0
    23.09.2012 08:50:00
    У меня был похожий баг-репорт по моему клиенту… Похоже, что несмотря на то, что в спецификации API написано (что обработка начинается при получении конца предложения), на самом деле обработка стартует только тогда, когда RouterOS собирается отправить тебе ответ. Но если ты специально не запрашиваешь такой ответ, то есть просто отключаешься, RouterOS ничего не сделает. Чтобы исправить это, просто сделай read() после write, например:  
    $API->write("/ip/firewall/address-list/remove", false);  
    $API->write("=.id=$id", true);  
    $API->read();  
    $i++;  
    Кстати, будет ГОРАЗДО эффективнее сначала получить все ID одной командой print, а потом передать все ID (через запятую) в команду remove. И к чему все эти задержки? Ты что, пытаешься намеренно замедлить код?
     
     
     
    stimels
    Guest
    #9
    0
    23.09.2012 08:59:00
    Спасибо, я вставил $API->read(); код работает. Как можно оптимизировать код?

    if (count($removeiparray) > 0)
    {
       foreach ($removeiparray as $remove)
       {
           echo "Удаляем следующий IP: " . $remove . "\n";

           $API->write("/ip/firewall/address-list/print", false);
           $API->write("?list=$ros_list", false);
           $API->write("?address=$remove", false);
           $API->write("=.proplist=.id");
           $READ = $API->read();
           $i = 0;
           foreach ($READ as $x) {
               $line = $READ[$i];
               $id = $line['.id'];
               sleep(1);

               $API->write("/ip/firewall/address-list/remove", false);
               $API->write("=.id=$id", true);
               $API->read();
               $i++;
           }
       }
    }
     
     
     
    boen_robot
    Guest
    #10
    0
    23.09.2012 09:23:00
    Можно сначала спросить, почему вы выбрали именно тот клиент?* Используя мой клиент (смотрите мою подпись), можно сделать вот так (и если будете проводить замеры, увидите, что это намного эффективнее): <?php
    namespace PEAR2\Net\RouterOS;
    require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';

    $client = new Client('192.168.0.1', 'admin', 'password');

    $responses = $client->sendSync(
       new Request('/ip/firewall/address-list/print .proplist=.id', Query::where('list', 'mylist'))
    )->getAllOfType(Response::TYPE_DATA);

    $idList = '';
    foreach ($responses as $response) {
       $idList .= $response->getArgument('.id') . ',';
    }

    if ('' !== $idList) {
       $removeRequest = new Request('/ip/firewall/address-list/remove');
       $removeRequest->setArgument('numbers', rtrim($idList, ','));
       $client->sendSync($removeRequest);
    } То же самое можно сделать с клиентом Дениса. (код выше можно сократить — особенно если у вас PHP 5.4 — но я оставляю его подробным для понятности). Нет, честно... я не критикую, просто действительно интересно. Каждый раз, когда задаю этот вопрос, люди либо упрямо используют класс Дениса без объяснений, либо переходят на мой клиент, не объясняя, почему раньше пользовались тем другим. И остаётся ощущение, что я что-то не так делаю с точки зрения «PR», хотя с «технической» стороны всё вроде нормально.
     
     
     
    stimels
    Guest
    #11
    0
    23.09.2012 12:17:00
    Я использовал этот клиентский API: http://wiki.mikrotik.com/wiki/API_PHP_class, потому что не работаю с pear.
     
     
     
    boen_robot
    Guest
    #12
    0
    23.09.2012 12:31:00
    Аааа… лицо в ладошку… Я и так подозревал… Несмотря на название, PEAR(2) не обязателен. На самом деле, это даже не опциональная зависимость. Всё, что нужно, включено в PHAR-файл, который можно просто подключить напрямую, как в примере выше. Другими словами, вам не нужно заморачиваться с PEAR, чтобы использовать это. Правка: Ладно… Я добавил поддержку MikroTik, чтобы убрать часть про «использование PEAR2», потому что это вводит в заблуждение…
     
     
     
    janisk
    Guest
    #13
    0
    24.09.2012 08:46:00
    API утверждает, что на каждую успешно отправленную команду будет ответ с результатами выполнения. Так что, в целом, хорошая идея — получать ответ, чтобы понять, всё прошло успешно или нет (например, !re или !trap в ответе).
     
     
     
    stimels
    Guest
    #14
    0
    24.09.2012 14:55:00
    Хорошо, я попробую.
     
     
     
    clarkritchie
    Guest
    #15
    0
    10.04.2015 18:40:00
    Я пытаюсь сделать что-то похожее на Python. Но .id, который я получаю, не является десятичным числом, и я не могу передать его в команду remove. Хочу отключить PPPoE пользователя #0: [admin@BOMA_lab] > /ppp active print
    Flags: R - radius  
    #   NAME         SERVICE CALLER-ID         ADDRESS         UPTIME   ENCODING  
    0 R andristhe... pppoe   D4:CA:6D:04:C0:14 0.0.0.0         18m40s  

    Вот что возвращает мне API:  
    <<< /ppp/active/print  
    <<< =.proplist=.id  
    <<<  
    >>> !re  
    >>> =.id=*80000010  

    Не могу ничего сделать с *80000010, например:  
    */interface/pppoe-server/remove=.id=80000010* — не работает,  
    /interface/pppoe-server/remove=.id=80000010 — тоже нет.  

    *80000010 похоже на указатель на ячейку памяти, а не на пригодное для использования число в десятичной системе.  

    Я что-то упускаю? Спасибо. Это RouterOS 6.20.
     
     
     
    Chupaka
    Guest
    #16
    0
    13.04.2015 09:53:00
    Если вы получили .id из /ppp/active, то использовать его нужно именно в /ppp/active, а не в /interface или где-то ещё. Правильная команда такая: /ppp/active/remove
    =.id=*80000010
     
     
     
    Raelkbg
    Guest
    #17
    0
    12.04.2018 09:24:00
    Привет, нужна помощь с командой reset-counters. Вот мой код на C#: var cmd = connection.CreateCommandAndParameters("/tool/user-manager/user/reset-counters", "?=numbers", txtreset.Text); Я пытался использовать .id вместо numbers, но, к сожалению, продолжаю получать одну и ту же ошибку «no such command».
     
     
     
    Chupaka
    Guest
    #18
    0
    13.04.2018 15:10:00
    Это значит, что команда «/tool/user-manager/user/reset-counters» не существует. Попробуйте без пробела в конце строки («…ters» вместо вашего «…ters »).
     
     
     
    u1b2n3t41520
    Guest
    #19
    0
    25.02.2020 03:55:00
    У меня это работает: <?php
       try {
           $client = new RouterOS\Client('192.168.88.1', 'admin', 'password');
       } catch (Exception $e) {
           echo "ошибка: ".$e;
           die('Не удалось подключиться к роутеру.');
           
       }
    ///ip firewall address-list remove [/ip firewall address-list find address=192.168.88.14]
    $printRequest = new RouterOS\Request('/ip/firewall/address-list/print');
    $printRequest->setArgument('.proplist', '.id');
    $printRequest->setQuery(RouterOS\Query::where('address', '192.168.88.14'));
    $id = $client->sendSync($printRequest)->getProperty('.id');
    //$id теперь содержит ID записи, на которую мы нацелены
    $setRequest = new RouterOS\Request('/ip/firewall/address-list/remove');
    $setRequest->setArgument('numbers', $id);
    $client->sendSync($setRequest);
    ?>
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры