我正在尝试从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中读取密码?
答案 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);