1

我正在尝试从 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 调试器中运行了它,并注意到当调试器运行 open 行时,我可以运行注释掉的打印行并且错误已经在输出文件中。

那么,我忘记做什么才能使它起作用?我如何告诉 open “等待 STDIN”?

- -更新!

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

echo password | some_program

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

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

4

1 回答 1

0

考虑some_program是一个在其命令行上接受密码的 bash 脚本(Shell),这可以使用systemperl 中的调用来完成。系统调用,即 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);
于 2012-07-30T23:29:27.013 回答