2

我正在构建一个验证用户凭据的 MATLAB 应用程序。我想读入他的密码,并且想以某种方式隐藏他输入的凭据。

一些限制:

  • 我必须考虑到 windows 以及 linux/mac 用户。
  • 我不能保证用户系统中有任何程序(perl/python/VBS)。

这是我尝试过的:

直接指南

工作,但不是一个选项,因为用户可能在-nodesktop(或-nodisplay)模式下运行 matlab。

MATLAB + Java

控制台.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 上:

资源=

GetConsoleMode 失败,LastError=|6| 在 ReadKey.pm 第 264 行。

斯塔=

 9

到目前为止,我的搜索表明这是与 Windows 的 perl 打包版本有关的问题。

知道上述方法中发生了什么吗?

4

2 回答 2

1

我建议您ispc通过创建 MATLAB GUI 或类似的东西来检测 Windows 安装 (),并以不同于类 Unix 系统的方式处理它们。

这是使用MATLAB 内部的.NET Windows 窗体的一种可能的 Windows 解决方案:

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

截屏

使用 Swing 的JPasswordField在Java中做类似的事情应该很简单

于 2012-08-11T09:46:17.007 回答
0

Java 获取密码

我还没有设法让 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())

然后在matlab中

[status,pass] = system('python usergetpass.py');

然后,您将不得不(简单地)解析pass,实际密码包含在pass.

因此,您可以将上述内容放入您自己的迷你 matlab 函数中,

function out = getpass()
[status, pass] = system('python usergetpass.py');
out = pass(13:end-1);

注意:我可以使用它,因为密码总是出现在 pass 变量中。

于 2012-08-10T18:57:19.693 回答