parssing вывода команды ping

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
UncleGringo
Сообщения: 3
Зарегистрирован: 09 ноя 2020, 19:34

Уважаемые Форумчане!

Есть подозрение что спрашиваю "простой" вопрос, ответ на который лежит на поверхности,
но простите, не смог найти ни примеров и не получилось сделать самому script для моей задачи.
Вроде перелопатил https://wiki.mikrotik.com/wiki/Manual:Scripting и https://wiki.mikrotik.com/wiki/Manual:S ... g-examples, но не получается.
Тут на форуме тоже не нашел похожей обработки того что команда возвращает или плохо искал.
Ткните пожалуйста в что либо подобное, как разбирается вывод от команд.

Задача вроде бы "простая":

есть команда ping:

Код: Выделить всё

[admin@Router] > /ping 8.8.8.8 count=3 ttl=1 
  SEQ HOST                                     SIZE TTL TIME  STATUS                                                                                                                   
    0 10.*.*.1                                       84  64 1ms   TTL exceeded                                                                                                             
    1 10.*.*.1                                       84  64 0ms   TTL exceeded                                                                                                             
    2 10.*.*.1                                       84  64 1ms   TTL exceeded                                                                                                             
    sent=3 received=0 packet-loss=100% 
или

Код: Выделить всё

[admin@Router] > /ping 8.8.8.8 count=3 ttl=5
  SEQ HOST                                     SIZE TTL TIME  STATUS                                                                                                                   
    0 72.14.217.60                               56 251 3ms   TTL exceeded                                                                                                             
    1 72.14.217.60                               56 251 5ms   TTL exceeded                                                                                                             
    2 72.14.217.60                               56 251 4ms   TTL exceeded                                                                                                             
    sent=3 received=0 packet-loss=100% 
ping возвращает значение количества удачных пингов, в данном случае "3"

как получить значения HOST, TIME, STATUS для каждого пига и среднее значения "packet-loss" ?

Заранее спасибо!

P.S. вот пробую... но это не работает...

Код: Выделить всё

:local pingssent 0;
:local pingloss 0;
:local pinglimit 4;
:local ttllimit 4;

/ping address=8.8.8.8 count=$pinglimit ttl=$ttllimit  do={
        :if ($sent = $pinglimit) do={
             :set pingssent $"sent"
             :if ($pingssent > 0) do={
                  :set pingloss $"packet-loss"
             }
        }
}

:log info (Pings send: " . $pingssent ." lost: ". $pingloss )


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

UncleGringo писал(а): 09 ноя 2020, 20:08 но это не работает...
немного переделал, чтоб работало..

Код: Выделить всё

{
:local pinglimit 4;
:local ttllimit 4;
:local sent [/ping address=8.8.8.8 count=$pinglimit ttl=$ttllimit]
:local pingloss (100 - 100 / $pinglimit*$sent)
:log info message="Pings send:$sent lost:$pingloss %"
}


UncleGringo
Сообщения: 3
Зарегистрирован: 09 ноя 2020, 19:34

Virtue писал(а): 09 ноя 2020, 22:51
UncleGringo писал(а): 09 ноя 2020, 20:08 но это не работает...
немного переделал, чтоб работало..
спасибо дружище, но это не вариант, это вы просто рассчитываете самостоятельно значение % потерь,
а мне хочется получить/обрабатывать, то что ping возвращает, особенно HOST и значение задержки каждого пинга...


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Этого пинг вернуть не может. /ping в ROS Микротик возвращает только количество удачных пингов


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
UncleGringo
Сообщения: 3
Зарегистрирован: 09 ноя 2020, 19:34

Sertik писал(а): 10 ноя 2020, 13:29 Этого пинг вернуть не может. /ping в ROS Микротик возвращает только количество удачных пингов
Может как-то можно вывод /ping запихнуть автоматом в array ? или есть/видел примеры парсинга вывода таких команд как ping !?


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Ping массив данных в скрипте не отдаёт, только количество удачных ответов.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
DyadyaGenya
Сообщения: 31
Зарегистрирован: 08 май 2023, 01:29

Sertik писал(а): 11 ноя 2020, 10:42 Ping массив данных в скрипте не отдаёт, только количество удачных ответов.
Ситуация не поменялась? Все ещё нельзя достать результаты пингования?
Ну или записать в каждую ячейку/значение массива строку результатов пинга, чтоб было типа такого:

Код: Выделить всё

array {
  "0  8.8.8.8    56  116  58ms28us",
  "1  8.8.8.8    56  116  36ms707us"
  }


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Можно сохранить результат в файл, и его уже распарсить, если очень надо.

Код: Выделить всё

local a "ping 192.168.1.25 count 4";
execute script=$a file=1.txt


BratWolfa
Сообщения: 6
Зарегистрирован: 26 ноя 2014, 20:53

Присоединяюсь, частично, к данному вопросу. По такому принципу хотел ребутить роутер, к примеру, если пинг выше 200 ... Или можно, как то, это решить другими методами?


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

BratWolfa писал(а): 19 июл 2023, 12:10 Присоединяюсь, частично, к данному вопросу. По такому принципу хотел ребутить роутер, к примеру, если пинг выше 200 ... Или можно, как то, это решить другими методами?
можно использовать мой метод с количеством удачных ответов, но при этом ограничить каждый запрос временем ожидания 200, например так

Код: Выделить всё

ping interval=00:00:00.200 ya.ru


Ответить