Perl:打开一个用于写入的管道,但程序并没有“等待”STDIN

时间:2012-07-30 18:07:58

标签: perl pipe stdout stdin

我正在尝试从perl脚本运行程序。 我将STDOUT和STDERR重定向到两个不同的文件。 我正在运行的程序要求输入我尝试打印到进程句柄的密码,但这不起作用,因为程序立即打印出一个验证错误,警告我没有写任何东西到STDIN。

我使用的代码与此类似:

my $s = qq(some_program > someprogram.out 2> someprogram.err);
open(my $f, "|$s") or die "Couldn't run program: $! $?";
# print `cat someprogram.out`; # An error has already been printed here!
print $f "password\n";
close $f or die "$!: $?";

我在perl调试器中运行了这个,并注意到当调试器运行打开的行时,我可以运行注释掉的打印行,错误已经在输出文件中。

那么,为了让这个工作,我忘了做什么? 如何判断“等待STDIN”?

--- UPDATE!

我在命令行中做了这样的测试:

echo password | some_program

并且打印了身份验证错误。所以看起来 some_program 实际上并不是从STDIN读取而是从tty读取。

有没有办法打印到tty所以程序可以从Perl中读取密码?

1 个答案:

答案 0 :(得分:0)

考虑some_program是一个bash脚本(Shell),它在命令行上接受密码,这可以使用perl中的system调用来完成。系统调用,即Perl中的程序执行不会停止输入密码,最好的办法是在使用系统调用调用程序之前询问用户密码。使用反引号执行系统调用,如下所示;

my $outfile="/path/to/someprogram.out";
my $errfile="/path/to/someprogram.err";
print "Enter password:\n";
$passwd=<>;
print "some_program $passwd\n";
`some_program $passwd > $outfile 2> $errfile`;

或使用system();

my $outfile="/path/to/someprogram.out";
my $errfile="/path/to/someprogram.err";
print "Enter password:\n";
$passwd=<>;
my $command="some_program $passwd > $outfile 2> $errfile";
print "$command\n";
system($command);