Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl如何在不在终端中显示密码的情况下提示输入密码?_Perl_Terminal_Passwords - Fatal编程技术网

Perl如何在不在终端中显示密码的情况下提示输入密码?

Perl如何在不在终端中显示密码的情况下提示输入密码?,perl,terminal,passwords,Perl,Terminal,Passwords,如何在终端中不显示密码的情况下提示终端用户输入密码?有一个类似的问题,但答案似乎过时或不完整 我一直在寻找这个问题的答案,但对于结果后面几页中与其他问题的答案相去甚远的问题并不满意 还有一个例子是不完整的(哦,是谁维护的;) 当您在不重置终端的情况下执行此操作时,不会有任何其他响应!哎呀 我也在寻找更新的答案或模块,我们可以提供给想要这样做的人。要使用,这项功能: sub prompt_for_password { require Term::ReadKey; # Tell t

如何在终端中不显示密码的情况下提示终端用户输入密码?有一个类似的问题,但答案似乎过时或不完整

我一直在寻找这个问题的答案,但对于结果后面几页中与其他问题的答案相去甚远的问题并不满意

还有一个例子是不完整的(哦,是谁维护的;)

当您在不重置终端的情况下执行此操作时,不会有任何其他响应!哎呀

我也在寻找更新的答案或模块,我们可以提供给想要这样做的人。

要使用,这项功能:

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;
}
子提示\u输入密码{
需要术语::ReadKey;
#告诉终端不要显示键入的字符
术语::ReadKey::ReadMode('noecho');
打印“输入您的密码:”;
我的$password=Term::ReadKey::ReadLine(0);
#将终端恢复到以前的状态
术语::ReadKey::ReadMode('restore');
#你打的那个没有回音!
打印“\n”;
#摆脱那讨厌的行尾(在Windows上工作)
$password=~s/\R\z/;
#说“密码是”;#检查你在做什么:)
返回$password;
}
您还可以使用:

$perl-MIO::Prompter-wE'$pass=prompt(“密码:”,-echo=>“*”)$通过=~s/\R\z/;说$pass'

仅仅要求输入密码可能有点过分,但如果您还需要获取其他类型的用户输入,那么它也很有用。请注意,您确实需要密码屏蔽功能才能工作。不幸的是,模块在构建时没有警告您这一点。如果上面的一行代码生成警告,您将知道您处于这种情况:

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

我无法理解警告信息与解释中给出的含义的对应关系,但是,哦,好吧

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

可在Win32和Unix上工作(尽管其名称表明并非如此)。在它使用的Unix上


不幸的是,我找不到一个能与标准Perl模块一起工作的简短解决方案(即不安装)。如果无法从CPAN安装,可能需要从上面的模块复制粘贴代码。

网上有许多建议包含
系统(“stty-echo”)
,但这在Win32上不起作用(仅限于Unix),使用它的实际健壮解决方案很快变得复杂(超过30行,存在可移植性问题):1。处理Ctrl-C是一个混乱的过程(需要
$SIG{INT}=…
或更多
stty
标志),以及2。在stdin、stdout或stderr被重定向的情况下,获取TTY设备文件句柄并将其传递给stty(使用shell重定向或一些Perl
open(…)
magic)是一件棘手的事情。

这可以通过决定修剪前导或尾随空格以及如何从末尾删除某些内容来改进。在Windows上,
chomp
可能不会做正确的事情。通过上面的例程,
chomp
在Windows上做正确的事情。有关
IO::Prompter
的问题,请参阅。如果用户在密码提示下按Ctrl-C,此解决方案不会将终端恢复到以前的(echo)状态。为了解决这个问题,a
$SIG{INT}=sub{…}处理程序。它是一个社区wiki,因此您可以编辑答案:)过去几年这里有什么变化吗?-对我来说(截至2020年9月),这与LWP::UserAgent一起工作:
print“password please:”;ReadMode('noecho');my$pass=读线(0);咀嚼($pass)$请求->授权\u基本('username',$pass)LWP与此无关。否则您的代码相同。正确。我的意思是,我在LWP的上下文中使用了perlfaq8中的那些行(这可能是无用的信息)——在这种上下文中,它工作得非常好。没有问题,无需重置终端。(可能是4年前你看到的问题在哪里解决了?不知道)
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;
}
use strict;
use warnings;
use Term::ReadPassword::Win32 qw(read_password);
my $input = read_password("Password: ");
say $input;