如何在不显示终端密码的情况下提示终端用户输入密码? How can I enter a password using Perl and replace the characters with '*'?也有类似的问题,但答案似乎已过时或已损坏。
我一直在寻找这个问题的答案,并且对后来的结果页面上的问题感到满意,这些问题的答案与其他问题相关。
另外,perlfaq8有一个不完整的例子(哦,过去曾经保持这个;)。
use Term::ReadKey;
ReadMode('noecho');
my $password = ReadLine(0);
当你这样做而不重置终端时,没有别的回声!糟糕!
我也在寻找能够为想要这样做的人提供更新的答案或模块。
答案 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被重定向。