Привет! Можешь, пожалуйста, рассказать, как создать рабочий скрипт для RouterOS версии 7.15.3?

Мне нужно найти в логах сообщение "92.39.139.179 parsing packet failed, possible cause: wrong password". Скрипт должен выполняться, чтобы искать фразу "parsing packet failed, possible cause: wrong password", извлекать IP-адрес и добавлять его в черный список. Я нашел решение в интернете и с помощью Yandex GPT, но оно работало только с маской /24. 

Вот оригинальный код: 
```
:foreach i in=[/log find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ parsing packet failed, possible cause: wrong password"] do={
    :local msg [/log get $i message];
    :local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");
    /ip firewall address-list add list=block_vpn_access address=$ip;
}
```

Я предположил, что строку `:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");` нужно просто заменить на `:local ip ([:pick $msg 0 [:find $msg "." [:find $msg " "]]]);`, но в таком случае скрипт не работает вовсе. Почему это так сложно?
  • 18 сентября 2024 г. 11:33
Ответы на вопрос 2
Скрипт для RouterOS может быть немного запутанным, особенно когда дело касается извлечения данных из текстовых строк и работы с IP-адресами. Давайте разберем ваш запрос и исправим код так, чтобы он работал корректно для извлечения IP-адреса и добавления его в черный список.

В вашем исходном коде ошибка заключается в том, что вы пытаетесь использовать строку `[:pick $msg 0 [:find $msg "." [:find $msg " "]]]` для извлечения IP-адреса, что может не сработать из-за неправильных индексов. Вместо этого, мы можем использовать `:find` более продуманно, чтобы извлечь правильный IP.

Вот исправленный код:

```rsc
:foreach i in=[/log find message~"parsing packet failed, possible cause: wrong password"] do={
    :local msg [/log get $i message];
    # Ищем первую точку в сообщении
    :local startIndex [:find $msg " "];
    # Ищем вторую точку
    :local secondDotIndex [:find $msg "." ($startIndex + 1)];
    # Ищем третью точку
    :local thirdDotIndex [:find $msg "." ($secondDotIndex + 1)];
    # Ищем четвертую точку
    :local fourthDotIndex [:find $msg "." ($thirdDotIndex + 1)];
    
    # Извлекаем IP-адрес
    :local ipAddress [:pick $msg 0 $fourthDotIndex];
    
    # Добавляем IP-адрес в черный список
    /ip firewall address-list add list=block_vpn_access address=$ipAddress;
}
```

Этот скрипт работает следующим образом:

1. Использует цикл `:foreach` для перебора всех записей в логах, содержащих нужное сообщение.
2. Извлекает сообщение логов.
3. Находит индексы каждой точки в IP-адресе.
4. Извлекает IP-адрес, используя полученные индексы.
5. Добавляет IP-адрес в адресный список `block_vpn_access`.

Обратите внимание, что в вашем случае, если IP-адрес может быть отформатирован по-разному или содержать дополнительные пробелы, возможно, потребуется улучшить алгоритм анализа строки. Но этот подход должен подойти для получения IP-адресов, если формат сообщения строго определен и не изменяется.
:local msg "192.168.1.123 parsing packet failed, possible cause: wrong password"
:local ipAddress [:pick $msg 0 [:find $msg " parsing packet failed"]]
:log info "IP Address: $ipAddress"
Похожие вопросы