2

ユーザーの資格情報を認証するMATLABアプリケーションを構築しています。彼のパスワードを読みたいのですが、入力した資格情報をなんとか隠したいのです。

いくつかの制約:

  • Linux/macユーザーだけでなくWindowsも考慮に入れる必要があります。
  • ユーザーシステム内のプログラム(perl / python / VBS)を保証することはできません。

これが私が試したことです:

ストレートアップガイド

動作しますが、ユーザーがmatlabを-nodesktop(または-nodisplay)モードで実行している可能性があるため、オプションではありません。

MATLAB + Java

console.readPassword。これは私の端末をひどく台無しにします。

system()呼び出し

基本的に、私はOSに基づいてbashまたはdosスクリプトを呼び出します。

linux/macに対して次の呼び出しがあります。

[status cred] = system('stty -echo; read cred; stty echo;echo ""; echo "$cred"');

これは、ユーザーの資格情報を取得し、それを「cred」にダンプすることになっています。>>通常のターミナルで動作することを確認しましたが、MATLABで実行しても何も出力されず、プロンプトを戻すにはCtrl-Cが必要です。

MATLAB Perl

コメントで指摘されているように、WindowsMATLABは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

これまでの私の検索では、Windows用のperlのパッケージバージョンに関連する問題であることが示唆されています。

上記のアプローチで何が起こっているのか考えていますか?

4

2 に答える 2

1

Windowsのインストール(ispc)を検出し、MATLAB GUIなどを作成して、Unixライクなシステムとは異なる方法で処理することをお勧めします。

以下は、MATLAB内から.NETWindowsフォームを使用するWindowsの1つの可能な解決策です。

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

コンソールを通常の状態に戻すための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必要がありますが、実際のパスワードはの3行目に含まれていますpass

したがって、上記を独自のミニMATLAB関数に組み込むことができます。

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

注:パスワードは常にpass変数のその時点で発生するため、これを使用できます。

于 2012-08-10T18:57:19.693 に答える