Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • 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
     
    skot
    Guest
    #1
    0
    27.03.2012 21:34:00
    Есть ли способ отслеживать входы в роутер и запускать при этом скрипт или отправлять письмо?
     
     
     
    hngjared
    Guest
    #2
    0
    11.07.2014 16:48:00
    Абсолютно верно! Рекс, ещё одна последняя вещь, когда/если у тебя будет минутка. Скрипт работает нормально, но переменная $currentTime после запуска скрипта показывает дату 1 января 1970 года. Есть идеи, почему так? Время на моём Routerboard отображается правильно и актуально.
     
     
     
    skot
    Guest
    #3
    0
    26.04.2012 23:57:00
    Я разобрался… Этот скрипт направил меня в нужное русло: http://wiki.mikrotik.com/wiki/Manual:Scripting-examples#Detect_new_log_entry. Следующий скрипт я использую вместе с планировщиком:

    # Скрипт для проверки новых специфичных записей в логе и отправки email-уведомлений  
    # Проверено на RouterOS v5.7+

    # контейнер для отслеживания последнего зафиксированного временного штампа  
    :global lastTime;

    # ищем записи в логе, где сообщение содержит "logged in" или "login failure"  
    :local currentBuf [ :toarray [ /log find message~"logged in" || message~"login failure" ] ];
    # получаем количество записей  
    :local currentLineCount [ :len $currentBuf ];

    # если есть записи, продолжаем  
    if ($currentLineCount > 0) do={  
    # исходя из количества записей, получаем время последней  
    :local currentTime "$[ /log get [ :pick $currentBuf ($currentLineCount -1) ] time ]";

    # проверяем длину currentTime, если 15 — запись из предыдущего дня и начинается с месяц/день  
    :if ([:len $currentTime] = 15 ) do={
    # обрезаем currentTime, оставляя только время xx:xx:xx  
    :set currentTime [ :pick $currentTime 7 15 ];
    }

    # формируем тело письма с временной меткой и сообщением лога  
    :local output "$currentTime $[/log get [ :pick $currentBuf ($currentLineCount-1) ] message ]";

    # функция отправки email  
    :local sndEmail [:parse "/tool e-mail send to=email@domain.com subject=\"MikroTik alert $currentTime\" body=\"$output\" tls=yes"];

    # функция звукового сигнала  
    :local doBeep [:parse ":beep;:delay 150ms;:beep;"];

    # если lastTime ещё не задан (длина 0 — например, после перезагрузки)  
    :if ([:len $lastTime] < 1 ) do={
    # обновляем lastTime на currentTime  
    :set lastTime $currentTime ;  
    # отправляем письмо и звуковой сигнал  
    $sndEmail;  
    $doBeep;  
    # если lastTime уже есть, продолжаем  
    } else={  
    # если lastTime не совпадает с последним временным штампом  
    :if ( $lastTime != $currentTime ) do={  
    # обновляем lastTime  
    :set lastTime $currentTime ;  
    # отправляем письмо и звуковой сигнал  
    $sndEmail;  
    $doBeep;  
    }  
    }  
    }
     
     
     
    skot
    Guest
    #4
    0
    07.10.2013 20:06:00
    v3 - Обновлено с некоторыми изменениями: Добавлен массив removeThese для фильтрации нежелательных записей в логе. Дублируйте строки в кавычках и разделяйте запятыми. Если не хотите фильтровать логи, просто объявите переменную :local removeThese или оставьте двойные кавычки :local removeThese (“”). Оптимизирован последний блок :if, чтобы избежать повторяющегося кода. Убраны функции [:parse], так как, похоже, они не работают в v6.2. Отметка времени теперь сохраняется в комментарии расписания, а не в глобальной переменной — это нужно, чтобы при сохранении логов на диск не приходили дублированные оповещения после перезагрузки.

    :local scheduleName “mySchedule”  
    :local emailAddress “myEmail”  
    :local startBuf [:toarray [/log find message~“logged in” || message~“login failure”]]
    :local removeThese (“telnet”,“любой_нужный_вам_текст”)  
    :local lastTime [/system scheduler get [find name=“$scheduleName”] comment]
    :local currentBuf “”  
    :set currentBuf [:toarray $currentBuf]
    :foreach i in=$startBuf do={  
     :local toggle 1  
     :foreach j in=[:toarray $removeThese] do={
       :if ([:typeof [:find [/log get $i message] “$j”]] = “num”) do={
         :set toggle 0  
       }  
     }  
     :if ($toggle = 1) do={  
       :set currentBuf ($currentBuf , $i)  
     }  
    }  
    :local currentLineCount [:len $currentBuf]
    if ($currentLineCount > 0) do={  
     :local currentTime “$[/log get [:pick $currentBuf ($currentLineCount -1)] time ]”
     :if ([:len $currentTime] = 15) do={
       :set currentTime [:pick $currentTime 7 15]
     }  
     :local output “$currentTime $[/log get [:pick $currentBuf ($currentLineCount -1)] message ]”
     :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
       /system scheduler set [find name=“$scheduleName”] comment=$currentTime
       /tool e-mail send to=“$emailAddress” subject=“MikroTik alert $currentTime” body=“$output”  
     }  
    }
     
     
     
    hngjared
    Guest
    #5
    0
    11.07.2014 13:59:00
    Скот, скрипт отличный и очень полезный! Молодец! Быстрый вопрос. Скрипт работает без сбоев на версии 6.2, как ты и говорил. Если у тебя будет свободная минутка, не мог бы ты взглянуть и попробовать на 6.13? У меня не получается запустить скрипт полностью на версиях выше 6.2. Было бы очень признательно! Спасибо!
     
     
     
    rextended
    Guest
    #6
    0
    11.07.2014 15:42:00
    :local scheduleName value="mySchedule";  
    :local emailAddress value="myEmail";  
    :local startBuf value=[:toarray [/log find where message~"logged in" or message~"login failure"] ];
    :local removeThese value=[:toarray ("telnet","whatever string you want")];

    :local lastTime value=("".[/system scheduler get [find name=$scheduleName] value-name=comment]);

    :local currentBuf value=[:toarray ""];

    :foreach i in=$startBuf do={  
    :foreach j in=$removeThese do={  
     :if ([/log get $i value-name=message] ~ $j) do={ } else={
      :set $currentBuf ($currentBuf,$i);  
     };  
    };  
    };  

    :local currentLineCount value=[:len $currentBuf];
     
    if ($currentLineCount > 0) do={  

    :local currentTime value=[/log get [:pick $currentBuf ($currentLineCount - 1)] value-name=time];

    :if ([:len $currentTime] = 15) do={
     :set $currentTime value=[:pick $currentTime 7 15];
    };  

    :local output value=($currentTime." ".[/log get [:pick $currentBuf ($currentLineCount - 1)] value-name=message]);
         
    :if ( ([:len $lastTime] < 1) or ( ([:len $lastTime] > 0) and ($lastTime != $currentTime) ) ) do={
     /system scheduler set [find where name=$scheduleName] comment=$currentTime;
     /tool e-mail send to=$emailAddress subject=("MikroTik alert ".$currentTime) body=$output;  
    }  

    }
     
     
     
    hngjared
    Guest
    #7
    0
    11.07.2014 16:27:00
    Рекс, ты настоящий! Если будешь продолжать решать мои проблемы, придётся взять тебя на работу. Очень благодарен!
     
     
     
    rextended
    Guest
    #8
    0
    11.07.2014 16:34:00
    Большое спасибо! Но помни, я исправляю только скрипт со стандартным синтаксисом, идея принадлежит не мне! Кроме вот этого:

    From :local toggle 1 :foreach j in=[:toarray $removeThese] do={ :if ([:typeof [:find [/log get $i message] “$j”]] = “num”) do={ :set toggle 0 } } :if ($toggle = 1) do={ :set currentBuf ($currentBuf , $i) }

    To :foreach j in=$removeThese do={ :if ([/log get $i value-name=message] ~ $j) do={ } else={ :set $currentBuf ($currentBuf,$i); }; };
     
     
     
    rextended
    Guest
    #9
    0
    11.07.2014 17:14:00
    Вижу, что новая версия RouterOS опускает дату в отметках времени, если дата совпадает с текущей:  
    /log> pri  
    jan/01/2002 02:00:09 system,info router rebooted  
    jan/01/2002 02:00:20 interface,info ether1 link up (speed 100M, full duplex)  
    jan/01/2002 02:00:24 dhcp,info dhcp-client on ether1 got IP address 192.168.1.101  
    19:11:42 system,info,account user admin logged in from 192.168.0.102 via winbox  
    19:12:34 system,info,account user admin logged in from 192.168.0.102 via telnet  

    Скрипт надо править под это... Я исправил синтаксис, но, кажется, нужно переделать то, как используются дата и время...  

    Также отсутствует год: пытаюсь установить время на 21 июля, и получаю такое:  
    /log> pri detail  
    time=jan/01/2002 02:00:09 topics=system,info message=“router rebooted”  
    time=jan/01/2002 02:00:20 topics=interface,info message=“ether1 link up (speed 100M, full duplex)”  
    time=jan/01/2002 02:00:24 topics=dhcp,info message=“dhcp-client on ether1 got IP address 192.168.1.101”  
    time=jul/11 19:11:42 topics=system,info,account message=“user admin logged in from 192.168.0.102 via winbox”  
    time=jul/11 19:12:34 topics=system,info,account message=“user admin logged in from 192.168.0.102 via telnet”  
    time=19:16:05 topics=system,info message=“system time zone settings changed by admin”
     
     
     
    rextended
    Guest
    #10
    0
    11.07.2014 17:18:00
    Думаю, на данном этапе сценарий нужно переписывать с нуля…
     
     
     
    hngjared
    Guest
    #11
    0
    11.07.2014 17:22:00
    Спасибо, я быстро написал скрипт, который убирает комментарий из расписания, чтобы скрипт продолжал работать, и удалил время из темы письма. Пока что это будет работать. Может, стоит попросить Скота обновить скрипт — он действительно будет очень полезен. Спасибо за время, уделённое сегодня.
     
     
     
    rextended
    Guest
    #12
    0
    11.07.2014 22:40:00
    Я поискал для тебя, почитай эту старую тему, там я выложил скрипт, чтобы сделать то, что тебе нужно. Не забудь прочитать всё!!! http://forum.mikrotik.com/t/script-send-email-as-user-login-into-routerboard/76788/1
     
     
     
    hngjared
    Guest
    #13
    0
    11.07.2014 22:51:00
    Спасибо, Рекс! Я немного изменил твои предложения и теперь скрипт работает так, как мне нужно, учитывая, что время для меня неважно. Обязательно загляну по твоей ссылке. В следующий раз, когда буду в Италии, угощаю тебя напитком!
     
     
     
    rextended
    Guest
    #14
    0
    12.07.2014 07:00:00
    Рассчитываю на это)
     
     
     
    rzirzi
    Guest
    #15
    0
    14.12.2014 18:31:00
    Отличный скрипт! Но почему по электронной почте отправляется только последнее сообщение из лога? Как настроить скрипт так, чтобы он отправлял все отслеживаемые сообщения с момента последнего изменения?
     
     
     
    skot
    Guest
    #16
    0
    16.12.2014 19:18:00
    Не знаю, почему это не сработало на версии 6.13. Только что запустил на 6.20 — без проблем. Рад, что правка от rextended помогла тебе. Этот код создает проблемы, когда в массиве removeThese несколько элементов. Например, если в массиве 5 элементов и один из них совпадает, этот код не добавляет совпадающий элемент. Но для остальных элементов он добавляет одну и ту же запись в лог в массив currentBuf целых 4 раза. В моём исходном коде это предотвращалось тем, что я перебирал все элементы, и если совпадение находилось хоть раз — запись в лог игнорировалась. Запись добавлялась только если совпадений вообще не было.

    Я знал, что в формате времени бывают два варианта (00:00:00 и jul/11 00:00:00), и скрипт v3 проверял оба. Но про третий вариант я не знал. Интересно, что это такое? Обновлю скрипт, чтобы он это тоже учитывал.
     
     
     
    skot
    Guest
    #17
    0
    16.12.2014 19:42:00
    Это хорошая идея. Помимо преимущества в том, что не пропадут никакие “промежуточные” записи, это ещё и даёт больше свободы. Если вы хотите, чтобы скрипт проверял новые входы, например, каждые 5 минут, он покажет все результаты. Я поработаю над новой версией с учётом этого.
     
     
     
    rzirzi
    Guest
    #18
    0
    17.12.2014 15:41:00
    Ты планируешь опубликовать этот новый скрипт в этой теме или на форуме? Было бы здорово :)
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры