MATLAB читать в пароле
Я создаю приложение MATLAB, которое аутентифицирует учетные данные пользователя. Я хочу прочитать его пароль и как-то скрыть его введенные учетные данные.
Некоторые ограничения:
- Я должен учитывать Windows, а также пользователи Linux/ Mac.
- Я не могу быть уверен ни в каких программах (perl/python/VBS) в пользовательской системе.
Вот что я попробовал:
Руководство по прямой
Работает, но не вариант, так как пользователь, вероятно, будет запускать Matlab в -nodesktop
(или же -nodisplay
) Режим.
MATLAB + Java
console.readPassword. Это ужасно портит мой терминал.
системные вызовы
По сути, я называю скрипты bash или dos для ОС.
У меня есть следующий вызов для Linux/ Mac:
[status cred] = system('stty -echo; read cred; stty echo;echo ""; echo "$cred"');
Предполагается, что он соберет учетные данные пользователя и отправит их в "cred". Я проверил, что он работает в обычном терминале, но выполнение его в MATLAB не приводит к выводу ничего, и требуется Ctrl-C, чтобы вернуть >>
незамедлительный.
MATLAB Perl
Windows MATLAB упаковывает Perl, как указано в комментариях. Я попробовал следующий фрагмент:
use Term::ReadKey;
use Term::ReadLine;
ReadMode('noecho');
$yesnoline = Term::ReadLine->new("foo");
$pass = $yesnoline->readline();
printf "$pass";
ReadMode('restore');
А потом назвал это [result status] = perl('my_perl.pl')
, Отлично работает на Linux. В Windows:
res =
Ошибка GetConsoleMode, LastError=|6| в строке ReadKey.pm 264.
sta =
9
Мои поиски до сих пор показывают, что это проблема, связанная с упакованной версией Perl для Windows.
Есть идеи, что происходит в вышеупомянутых подходах?
2 ответа
Я предлагаю вам обнаружить установку Windows (ispc
), и обрабатывать их иначе, чем в Unix-подобных системах, создавая графический интерфейс MATLAB или что-то подобное.
Вот одно из возможных решений для Windows, использующее .NET Windows Forms из MATLAB:
function pass = getPasswordNET()
%# password return value
pass = '';
%# hidden figure used to wait for button press
fig = figure('Visible','off', ...
'IntegerHandle','off', 'HandleVisibility','off');
%# create and show the Windows Forms GUI
[handles,lh] = InitializeComponents();
handles.frm.Show();
%# block execution until figure is closed
waitfor(fig)
%# remove the listeners
delete(lh);
return;
%# create GUI
function [handles,lh] = InitializeComponents()
%# import assembly
NET.addAssembly('System.Windows.Forms');
%# form
frm = System.Windows.Forms.Form();
frm.SuspendLayout();
%# textbox
tb = System.Windows.Forms.TextBox();
tb.Dock = System.Windows.Forms.DockStyle.Fill;
tb.Text = '';
tb.PasswordChar = '*';
tb.MaxLength = 14;
%# button
bt = System.Windows.Forms.Button();
bt.Dock = System.Windows.Forms.DockStyle.Bottom;
bt.Text = 'Submit';
%# setup the form
frm.Text = 'Password';
frm.ClientSize = System.Drawing.Size(250, 40);
frm.Controls.Add(tb);
frm.Controls.Add(bt);
frm.ResumeLayout(false);
frm.PerformLayout();
%# add event listeners
lh(1) = addlistener(bt, 'Click', @onClick);
lh(2) = addlistener(frm, 'FormClosing', @onClose);
%# return handles structure
handles = struct('frm',frm, 'tb',tb, 'bt',bt);
end
%# event handlers
function onClick(~,~)
%# get password from textbox
pass = char(handles.tb.Text);
%# close form
handles.frm.Close();
end
function onClose(~,~)
%# delete hidden figure (to unblock and return from function)
close(fig)
end
end
Я протестировал вышеупомянутое на своей машине, и оно работало, даже когда MATLAB запускался в режиме без головы:
matlab.exe -nodesktop -noFigureWindows
затем назвал это как:
>> pass = getPasswordNET()
pass =
secret_password
Это должно быть просто сделать что-то подобное в Java, используя JPasswordField Swing
Java getPassword
Мне пока не удалось заставить подход getPassword вернуть консоль в нормальное состояние - я предполагаю, что ваш код выглядит примерно так:
import java.lang.*
cs = System.console()
a = cs.readPassword()
Не могли бы вы подтвердить это?
Решение Python
Если решение должно быть многоплатформенным, и вы не возражаете против зависимости Python, я бы предложил написать очень простой сценарий Python и использовать его с системным вызовом Matlab, что-то вроде
файл: usergetpass.py
import getpass
import os
os.sys.stdout.write(getpass.getpass())
тогда в матлаб
[status,pass] = system('python usergetpass.py');
Затем вам придется (тривиально) разобрать pass
Тем не менее, фактический пароль содержится в строке 3 pass
,
Таким образом, вы можете поместить вышеупомянутое в вашу собственную функцию мини-Matlab,
function out = getpass()
[status, pass] = system('python usergetpass.py');
out = pass(13:end-1);
Примечание: я могу использовать это, потому что пароль всегда появляется в этой точке в переменной pass.