如果没有在终端中显示密码,Perl如何提示输入密码?

时间:2016-09-30 22:56:03

标签: perl terminal passwords

如何在不显示终端密码的情况下提示终端用户输入密码? How can I enter a password using Perl and replace the characters with '*'?也有类似的问题,但答案似乎已过时或已损坏。

我一直在寻找这个问题的答案,并且对后来的结果页面上的问题感到满意,这些问题的答案与其他问题相关。

另外,perlfaq8有一个不完整的例子(哦,过去曾经保持这个;)。

 use Term::ReadKey;
 ReadMode('noecho');
 my $password = ReadLine(0);

当你这样做而不重置终端时,没有别的回声!糟糕!

我也在寻找能够为想要这样做的人提供更新的答案或模块。

4 个答案:

答案 0 :(得分:10)

要使用Term::ReadKey,这可行:

sub prompt_for_password {
    require Term::ReadKey;

    # Tell the terminal not to show the typed chars
    Term::ReadKey::ReadMode('noecho');

    print "Type in your secret password: ";
    my $password = Term::ReadKey::ReadLine(0);

    # Rest the terminal to what it was previously doing
    Term::ReadKey::ReadMode('restore');

    # The one you typed didn't echo!
    print "\n";

    # get rid of that pesky line ending (and works on Windows)
    $password =~ s/\R\z//;

    # say "Password was <$password>"; # check what you are doing :)

    return $password;
}

答案 1 :(得分:2)

您还可以使用IO::Prompter

$ perl -MIO::Prompter -wE '$pass = prompt("Password: ", -echo => "*"); $pass =~ s/\R\z//; say $pass'

仅仅要求输入密码可能有点过分,但如果您需要引出其他类型的用户输入,它也很有用。请注意,您需要Term::ReadKey才能使密码屏蔽功能正常工作。不幸的是,该模块在构建时不会向您发出警告。如果上面的单行代码生成警告,您将知道您处于这种情况:

  

Warning: next input will be in plaintext

     

使用-echo标志调用prompt()子例程,但Term::ReadKey模块无法实现此功能。输入将正常进行,但会发出此警告以确保用户不会输入任何秘密内容,并希望它保持隐藏状态,而不是它。

警告信息如何与解释中给出的含义相对应,超出了我,但是,哦,哦。

请注意,在Windows上,模块在输入字符串的末尾留下CR chomp未删除(因为它正在查找CRLF序列)。这就是我在上面的示例中使用\R的原因。请参阅RT #118255

答案 2 :(得分:0)

Term::ReadPassword::Win32在Win32和Unix上均可使用(即使其名称另有说明)。在Unix上,它使用Term::ReadPassword

use strict;
use warnings;
use Term::ReadPassword::Win32 qw(read_password);
my $input = read_password("Password: ");
say $input;

不幸的是,我找不到适用于标准Perl模块(即未安装)的简短解决方案。如果无法从CPAN安装,则可能要从上面的模块中复制粘贴代码。

答案 3 :(得分:0)

在线上有很多包含system("stty -echo")的建议,但是在Win32(仅针对Unix)上不起作用,使用该方法的实际可靠解决方案很快变得复杂(超过30行,带有可移植性问题) :1.处理Ctrl- C 很麻烦(需要$SIG{INT} = ...或更多stty标志),并且2.获取TTY设备文件句柄并将其传递给{ {1}}(使用shell重定向或一些Perl stty魔术),以防stdin,stdout或stderr被重定向。