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

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

09 июн 2020, 14:59

Вот что вышло из баловства с [:terminal inkey]

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

# Скрипт смены пароля пользователя
# только для исполнения в терминале ROS

{
: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. Чупакабра, конечно, гений. Наверное уже работает в Микротик ... Мне бы так писать скрипты как он ! Хоть бы познакомиться когда-нибудь ...


Чего не знаем то нагуглим
pepelxl
Сообщения: 120
Зарегистрирован: 23 июл 2013, 18:47

21 июн 2020, 11:29

Скрипт интересен строкой преобразования кода символа из переменной $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
]]
Как видим первый запуск в три раза медленнее, но уже второй запуск показывает более быструю обработку даже такого короткого сообщения. А поскольку такие вещи как правило заворачивают в глобальные функции, то код постоянно не требует инициализацию и работает быстрее.


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

22 июн 2020, 12:13

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


Чего не знаем то нагуглим
Ответить