Страница 1 из 2

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

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

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

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

Добавлено: 03 июл 2019, 11:06
podarok66
Из принта ничего не присвоите. Из get или из find берите. Там главное дать чёткие признаки. Вот пример из рабочей машинки. Но это если один такой туннель

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

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

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

Добавлено: 03 июл 2019, 11:59
Luser
ver. 6.43.12
решил так:

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

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

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

Добавлено: 03 июл 2019, 14:20
Luser
исполнение вашего кода завершается ошибкой: invalid internal item number

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 08 июл 2019, 23:40
Luser
Помогите разобраться почему не работает код и не определяет переменную.
Есть активный пользователь в 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"
  }
}

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

Добавлено: 23 май 2022, 13:50
mister
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"
}
}