将expect插入perl循环

时间:2014-04-02 15:24:24

标签: perl loops passwords expect

我有以下运行命令的脚本并将数据放入数据库中。我需要考虑在某些时候被要求输入密码“密码:”的可能性。如何将预期调用包装到此?

#!/usr/software/bin/perl
use strict;
use DatabaseLib;
use Data::Dumper;
use Expect;

 #Connect to database
 my $dbh = DBI->connect($DB_CONNECT_STRING, $DB_USER, $DB_PASSWORD, { RaiseError => 1,      AutoCommit => 1 })
or die "failed to connect to database: $DB_CONNECT_STRING";

my $expect = Expect->new; 
my %burtHash;
my @cols = qw/date_create sub_by impact date-lastmod lastmod-by bug_rel case_score state s p type subtype subteam found_by target_release/;
my @burtInfo = `mycommand`;
my $timeout = 20;
my $password  = "password";

while(my $ele = shift(@burtInfo)){
my ($index, @data) = split(/\s+/, $ele);

for my $i(0 .. $#cols){
    $burtHash{$index}->{$cols[$i]} = shift(@data);
}
for my $id (keys %burtHash){
    my %burt_details;
    for my $col (keys %{$burtHash{$id}} ) {
       $burt_details{$col} = $burtHash{$id}->{$col};
    }
    if ( $id =~ /\d+/) {
        burt_update(
                $dbh,
                $id ,
                \%burt_details,
        );
    }
}
}

我想我只需要输入类似的内容并调用它,但我不知道在哪里/如何:

$expect->expect($timeout,
            [   qr/password:/i, #/
                sub {
                    my $self = shift;
                    $self->send("$password\n");
                    exp_continue;
                }
            ]);

1 个答案:

答案 0 :(得分:0)

你在那里的任何地方都没有使用$expect。您必须通过$expect->spawn运行命令,以便您的Expect对象可以处理事情。然后你需要一些收集输出的方法(我正在考虑使用$expect->log_file(...)将日志设置为字符串文件句柄或其他东西)。

使用$expect->spawn后,您可以插入密码检查。但是你无法用qx(反对)来做到这一点。