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_Pipe_Stdin - Fatal编程技术网

如何在管道输入Perl脚本后读取密码行

如何在管道输入Perl脚本后读取密码行,perl,pipe,stdin,Perl,Pipe,Stdin,我试图读取STDIN,然后获取用户输入行,而不在终端中显示它 Term::ReadKey的解决方案使用ReadMode('noecho')将不起作用,因为它使用,如果它不是空的,它会立即将(应该是文件的内容,例如管道数据)作为输入,而实际上不起作用: use warnings; use strict; use Term::ReadKey; my $_stdin = <STDIN>; print "Enter your password:\n"; ReadMode('noecho')

我试图读取
STDIN
,然后获取用户输入行,而不在终端中显示它

Term::ReadKey
的解决方案使用
ReadMode('noecho')
将不起作用,因为它使用
,如果它不是空的,它会立即将(应该是文件的内容,例如管道数据)作为输入,而实际上不起作用:

use warnings;
use strict;
use Term::ReadKey;

my $_stdin = <STDIN>;
print "Enter your password:\n";
ReadMode('noecho');
my $_pass = ReadLine(0); # This one uses <STDIN>!
ReadMode(0);
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";
输出:

$ echo "some data" | perl term-readkey.pl
Enter your password:
Use of uninitialized value $_pass in concatenation (.) or string at term-readkey.pl line 10, <STDIN> line 1. 
STDIN:
some data

Password:
$ echo "some data" | perl term-readkey.pl
Enter your password:
25 # actually entered it, and its visible...
STDIN:
some data

Password:
25

有一个解决方案,但答案是只在Unix系统上工作,输入是可见的…

因此我找到了解决方案,非常简单:

Term::ReadKey
的ReadMode与
中的
Term::ReadLine
的Term
一起使用,例如:

use Term::ReadLine;
use Term::ReadKey;

my $_stdin = <STDIN>;
my $_term = Term::ReadLine->new('term');
ReadMode('noecho', $_term->IN);
my $_pass = $_term->readline("Enter your password:\n");
ReadMode(0, $_term->IN);
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";

请注意,ReadLine()在文档中不适用于Windows(但您可以改为执行
)。您是否希望在特定的非Unixy体系结构上运行此功能?您可以尝试将
Term::ReadLine
findConsole
返回的设备名称与Unix'y解决方案相结合systems@Ujin谢谢,它起作用了。@Ujin但它又是可见的…啊,找到它了,只需使用
ReadMode('noecho',TTY)
。。。
use Term::ReadLine;
use Term::ReadKey;

my $_stdin = <STDIN>;
my $_term = Term::ReadLine->new('term');
ReadMode('noecho', $_term->IN);
my $_pass = $_term->readline("Enter your password:\n");
ReadMode(0, $_term->IN);
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";
use Term::ReadLine;
use Term::ReadKey;

my $_stdin = <STDIN>;
my $term = Term::ReadLine->new('term');
my @_IO = $term->findConsole();
my $_IN = $_IO[0];
print "INPUT is: $_IN\n";
open TTY, '<', $_IN;
print "Enter your password:\n";
ReadMode('noecho', TTY);
my $_pass = <TTY>;
ReadMode(0, TTY);
close TTY;
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";
Enter your password:
     # here enter hiddenly
STDIN:
stdin input

Password:
paws