Скрипт поиска имени клиента VPN

Раздел для тех, кто начинает знакомиться с MikroTik
Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку "Действия до настройки роутера".
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.
Luser
Сообщения: 5
Зарегистрирован: 13 сен 2017, 11:38

Здравствуйте уважаемые знатоки, прошу вашей помощи в написании скрипта.

Задача: При подключении пользователя к OVPN, исходя из имени клиента, отправить пакет WakeOnLan на сопоставленный mac-адрес.
Как я себе это представляю: в PPP профиле OVPN разместить скрипт в секции "On Up"
В чем проблема: не могу понять как присвоить переменную из вывода команды: ppp active print "ИМЯ клиента"


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Из принта ничего не присвоите. Из get или из find берите. Там главное дать чёткие признаки. Вот пример из рабочей машинки. Но это если один такой туннель

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

:put [ppp active get [/ppp active find service=sstp] name]
Если много, надо найти уникальный признак для каждого, который будет определять однозначный поиск.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Luser
Сообщения: 5
Зарегистрирован: 13 сен 2017, 11:38

ver. 6.43.12
решил так:

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

:local OPVNNameClient [/ppp active get [find name="ТоЧтоИщу"] name]; :if ($OPVNNameClient = "ТомуЧтоНужно") do {/system script run "ИмяСкриптаWOLдляКлиента"};
только приходится для каждого имени писать, хорошо бы все циклом устроить...
Последний раз редактировалось Luser 03 июл 2019, 19:32, всего редактировалось 1 раз.


Luser
Сообщения: 5
Зарегистрирован: 13 сен 2017, 11:38

исполнение вашего кода завершается ошибкой: invalid internal item number


KARaS'b
Сообщения: 1199
Зарегистрирован: 29 сен 2011, 09:16

Luser писал(а): 03 июл 2019, 10:13 Здравствуйте уважаемые знатоки, прошу вашей помощи в написании скрипта.

Задача: При подключении пользователя к OVPN, исходя из имени клиента, отправить пакет WakeOnLan на сопоставленный mac-адрес.
Как я себе это представляю: в PPP профиле OVPN разместить скрипт в секции "On Up"
В чем проблема: не могу понять как присвоить переменную из вывода команды: ppp active print "ИМЯ клиента"
Если пользователей не много, то для каждого можно забиндить интерфейс и в профиле указать уникальный профайл (предварительно создать), в котором уже указать то что вы хотите делать при поднятии интерфейса, т.е. тупо строчку с готовой командой на посыл WOL пакета.


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Luser писал(а): 03 июл 2019, 14:20 исполнение вашего кода завершается ошибкой: invalid internal item number
Блин, ну естественно. Я же сказал, что это просто пример из рабочей машинки. Я посмотрел имя, использовав в качестве признака в поиске имя сервиса. При другом признаке, например адресе клиента, будет работать поиск нормально.
И что вы там на жалобу жмёте? Вам нужно потревожить модератора? Так вот он я. Не трогайте эту кнопку по пустякам.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Luser
Сообщения: 5
Зарегистрирован: 13 сен 2017, 11:38

Спасибо всем за помощь. Жалобу видимо случайно нажал (трудности перевода), прошу извинить. А насчет команды с "рабочей машинки" я указал service=pptp, он был поднят. Я никогда не использовал скрипты в mikrotik, поэтому и обратился сюда на форум.

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

:put [ppp active get [/ppp active find service=pptp] name]
invalid internal item number: Разобрался...ошибка возникла т.к. было 2 активных pptp соединения...


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Да, да, именно так. Если под заданные параметры подойдут более одного результата, то выйдет ошибка с требование указать номер нужного результата. Именно поэтому нужно стараться задать параметры поиска так, чтобы подобной ошибки не было.
Вообще же, вариант с уникальными профилями под каждого юзера будет буквально идеальным. В профиле в последней вкладке пишите

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

tool wol mac=XX:XX:XX:XX:XX:XX interface=pptp
и как бы всё. Или там для каждого профиля разный интерфейс будет? Не соображу сейчас. Пробуйте, если что, смоделируем ситуацию и изменим скрипт.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Luser
Сообщения: 5
Зарегистрирован: 13 сен 2017, 11:38

Помогите разобраться почему не работает код и не определяет переменную.
Есть активный пользователь в PPP, отображаю в терминале:

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

:put  [/ppp active get [find name="Client1"] name];
Client1
Пытаюсь написать скрипт проверки всех по имени:
/system script run "MyScript"
с таким содержимым:

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

{
{
:local NameClientOVPN [/ppp active get [find name="Client1"] name]; 
:if ($NameClientOVPN = "Client1") do {/system script run "WOL PC1"};
}
{ 
:local NameClientOVPN [/ppp active get [find name="Client2"] name]; 
:if ($NameClientOVPN = "Client2") do {/system script run "WOL PC2"};
}
}
На что получаю: no such item
В другом варианте:
/system script run "MyScript1"

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

:local NameClientOVPN [/ppp active get [find name="Client1"] name]; :if ($NameClientOVPN = "Client1") do {/system script run "WOL PC1"};
:local NameClientOVPN [/ppp active get [find name="Client2"] name]; :if ($NameClientOVPN = "Client2") do {/system script run "WOL PC2"};
no such item
ИСПРАВИЛ:

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

foreach A in=[/ppp active get [/ppp active find service=ovpn] name] do={
  if ($A="Client1") do={
    /system script run "WOL PC1"
  }
  if ($A="Client2") do={
    /system script run "WOL PC2"
  }
}


mister
Сообщения: 2
Зарегистрирован: 23 май 2022, 13:40

Luser писал(а): 08 июл 2019, 23:40 Помогите разобраться почему не работает код и не определяет переменную.
Есть активный пользователь в PPP, отображаю в терминале:

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

:put  [/ppp active get [find name="Client1"] name];
Client1
Пытаюсь написать скрипт проверки всех по имени:
/system script run "MyScript"
с таким содержимым:

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

{
{
:local NameClientOVPN [/ppp active get [find name="Client1"] name]; 
:if ($NameClientOVPN = "Client1") do {/system script run "WOL PC1"};
}
{ 
:local NameClientOVPN [/ppp active get [find name="Client2"] name]; 
:if ($NameClientOVPN = "Client2") do {/system script run "WOL PC2"};
}
}
На что получаю: no such item
В другом варианте:
/system script run "MyScript1"

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

:local NameClientOVPN [/ppp active get [find name="Client1"] name]; :if ($NameClientOVPN = "Client1") do {/system script run "WOL PC1"};
:local NameClientOVPN [/ppp active get [find name="Client2"] name]; :if ($NameClientOVPN = "Client2") do {/system script run "WOL PC2"};
no such item
ИСПРАВИЛ:

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

foreach A in=[/ppp active get [/ppp active find service=ovpn] name] do={
  if ($A="Client1") do={
    /system script run "WOL PC1"
  }
  if ($A="Client2") do={
    /system script run "WOL PC2"
  }
}
Хорошее решение, но так не работает!
версия OS:6.48
А хотелось бы)
Работает вот так:
foreach A in=[/ppp active get [find name=Client1] name] do={
if ($A="Client1") do={
/system script run "Client1"
}
if ($A="Client2") do={
/system script run "WOL PC2"
}
}


Ответить