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

Скриптик переустановки пароля пользователя

Добавлено: 09 июн 2020, 14:59
Sertik
Вот что вышло из баловства с [:terminal inkey]

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

# Скрипт смены пароля пользователя
# только для исполнения в терминале ROS
# by Sertik 09/06/2020

{
:global EnterString do={
:local cont 0; :local string ""
:while ($cont!=13) do={
:local key ([:terminal inkey])
:if ($key!=13) do={
:local char [[:parse "(\"\\$[:pick "0123456789ABCDEF" (($key >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($key & 0xF)]\")"]]
:set string ("$string"."$char")}
:set cont $key
}
:return $string}
;
:put "Please, enter Username:"
:local RegUser [$EnterString];
:put "";
:if ([:len [/user find disabled=no name=$RegUser]]!=0) do={:put "Ok, a user with this name was found"; :put "";
:put "Please, enter new password for this user:"
:local newPass [$EnterString];
[/user remove $RegUser];
[/user add name=$RegUser password=$newPass group=full];
:put "";
:put "The user has been re-created, the password has been changed";
:put ("New user`s password: "."$newPass");
:put "Don't forget to set up access restrictions based on ip addresses";
  } else={:put ("User "."$RegUser "."not found"); :put "";
 }
}
Скрипт интересен строкой преобразования кода символа из переменной $key, сграбленного с клавиатуры терминала, в сам символ.

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

:local char [[:parse "(\"\\$[:pick "0123456789ABCDEF" (($key >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($key & 0xF)]\")"]]
Сам такое не написал бы никогда. Взята у Чупакабры вот отсюда https://habr.com/ru/post/337978/ (см. раздел статьи "Парсинг строки с кодом на лету и ее выполнение). Там же читайте объяснение как строка кода для преобразования собирается с помощью :parse и работает за счет вторых [] !
Я лишь преобразовал функцию Чупакабры по преобразованию кода символа в сам символ в функцию ввода строки $EnterString, которую можно вынуть из скрипта и пользоваться вообще по своему усмотрению.

P/S. Чупакабра, конечно, гений. Наверное уже работает в Микротик ... Мне бы так писать скрипты как он ! Хоть бы познакомиться когда-нибудь ...

Re: Скриптик переустановки пароля пользователя

Добавлено: 21 июн 2020, 11:29
pepelxl
Скрипт интересен строкой преобразования кода символа из переменной $key, сграбленного с клавиатуры терминала, в сам символ.
Код действительно не стандартен и я тоже бился на решением данной задачи вокруг parse, но так и не решил и пошел другим методом.
Код действительно компактный, но позволю себе немного улучшить чужой код и заменю

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

[[:parse "(\"\\$[:pick "0123456789ABCDEF" (($tmp >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($tmp & 0xF)]\")"]]

На

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

:local hex "0123456789ABCDEF"
[[:parse "(\"\\$[:pick $hex (($tmp >> 4) & 0xF)]$[:pick $hex ($tmp & 0xF)]\")"]]

Уже на довольно коротких сообщениях есть прирост ~ 100мс

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

:log info [:time [
:local input {0x68;0x65;0x6c;0x6c;0x6f;0x20;0x77;0x6f;0x72;0x64}
:local tmp
:local output
:for iter from=0 to=([:len $input] - 1) do={:set $tmp [:pick $input $iter]
:set $output ($output.[[:parse "(\"\\$[:pick "0123456789ABCDEF" (($tmp >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($tmp & 0xF)]\")"]]) }
:log info $output
]]

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

:log info [:time [
:local input {0x68;0x65;0x6c;0x6c;0x6f;0x20;0x77;0x6f;0x72;0x64}
:local tmp
:local output
:local hex "0123456789ABCDEF"
:for iter from=0 to=([:len $input] - 1) do={:set $tmp [:pick $input $iter]
:set $output ($output.[[:parse "(\"\\$[:pick $hex (($tmp >> 4) & 0xF)]$[:pick $hex ($tmp & 0xF)]\")"]]) }
:log info $output
]]

Если надо регулярно обрабатывать большие сообщения, то мой код получился более быстрый

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

:log info [:time [
:local symbolsHex {"\00";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";"\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";"\20";"\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\30";"\31";"\32";"\33";"\34";"\35";"\36";"\37";"\38";"\39";"\3A";"\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\41";"\42";"\43";"\44";"\45";"\46";"\47";"\48";"\49";"\4A";"\4B";"\4C";"\4D";"\4E";"\4F";"\50";"\51";"\52";"\53";"\54";"\55";"\56";"\57";"\58";"\59";"\5A";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\61";"\62";"\63";"\64";"\65";"\66";"\67";"\68";"\69";"\6A";"\6B";"\6C";"\6D";"\6E";"\6F";"\70";"\71";"\72";"\73";"\74";"\75";"\76";"\77";"\78";"\79";"\7A";"\7B";"\7C";"\7D";"\7E";"\7F";"\80";"\81";"\82";"\83";"\84";"\85";"\86";"\87";"\88";"\89";"\8A";"\8B";"\8C";"\8D";"\8E";"\8F";"\90";"\91";"\92";"\93";"\94";"\95";"\96";"\97";"\98";"\99";"\9A";"\9B";"\9C";"\9D";"\9E";"\9F";"\A0";"\A1";"\A2";"\A3";"\A4";"\A5";"\A6";"\A7";"\A8";"\A9";"\AA";"\AB";"\AC";"\AD";"\AE";"\AF";"\B0";"\B1";"\B2";"\B3";"\B4";"\B5";"\B6";"\B7";"\B8";"\B9";"\BA";"\BB";"\BC";"\BD";"\BE";"\BF";"\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";"\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";"\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";"\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF"};
:local input {0x68;0x65;0x6c;0x6c;0x6f;0x20;0x77;0x6f;0x72;0x64}
:local output
:for iter from=0 to=([:len $input] - 1) do={:set $output ($output.($symbolsHex->[:pick $input $iter])) }
:log info $output
]]
Как видим первый запуск в три раза медленнее, но уже второй запуск показывает более быструю обработку даже такого короткого сообщения. А поскольку такие вещи как правило заворачивают в глобальные функции, то код постоянно не требует инициализацию и работает быстрее.

Re: Скриптик переустановки пароля пользователя

Добавлено: 22 июн 2020, 12:13
Sertik
Код действительно компактный, но позволю себе немного улучшить чужой код и заменю
Вы не улучшили код, а вместо одной строки сделали две. То, что Ваш вариант работает быстрее - пусть так, видимо автора скрипта устраивал его вариант и ему это было не важно. Так, что насчет улучшения чужого кода это вряд ли. Когда научитесь писать скрипты хотя бы наполовину как Чупакабра покажите ...