Страница 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"
}
}