[SP-pm] perl - expect

Hernan Lopes hernanlopes at gmail.com
Tue Apr 22 06:09:38 PDT 2014


Esse exp_continue pode estar te atrapalhando, tenta comentar ele.

Tenta o seguinte:


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




Segue um exemplo funcional:

use Net::SSH2;
use Net::SSH2::Expect;

sub add_user {
my ( $self ) = @_;
$exp->send("adduser $config->{ user }->{ username }\n");
$exp->expect( 10, [
qr/Enter new UNIX password:/ => sub {
my ($exp, $line) = @_;
print $line;
$exp->send( $config->{ user }->{ password }."\n" );
},
qr|Retype new UNIX password:| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( $config->{ user }->{ password }."\n" );
},
qr|Full Name| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
},
qr|Room Number| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
},
qr|Work Phone| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
},
qr|Home Phone| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
},
qr|Other| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
},
qr|Is the information correct| => sub {
my ( $exp, $line ) = @_;
print $line;
$exp->send( "Y\n" );
},
]);
}



2014-04-22 9:57 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:

> Pessoal,
>
> Obrigado pelo interesse. Dando prosseguimento, e espero esclarecer melhor,
> tenho a seguinte situação:
>
> Como o Márcio havia dito, estou acessando um mainframe IBM pelo perl e
> expect. O retorno que recebo do IBM são prints da sua tela, em texto puro e
> o perl/expect participa dessa integração analisando essas telas.
>
> No meu caso, após conectar com o servidor e navegar até a tela onde devo
> tomar uma decisão, posso receber uma das seguintes telas, uma única vez:
>
> 1 - primeiro caso:
>
>  SELECIONE 'D' P/DETALHES
>   ADABAS11                   *** SUBSISTEMA DETALHES
> ***                    ADAB11
>   10/02/2014                     CONSULTA DE ORDEM
> 09:07:30
>   ORDEM  : 00ABC / AAAA
> Pag    1
>  OP ITEM             ORDEM
>   _ DETALHES          CASAS DOMES
>
>
>
>
>
>
>
>
>  Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
>                                            -PAG  +PAG
> VOLTA
>
> 2 - segundo caso:
>
>
>   ADABAS11                   *** SUBSISTEMA DETALHES
> ***                    ADAB11
>   10/02/2014                     CONSULTA DE ORDEM
> 09:11:30
>   ORDEM  : 00DEF / AAAA
> Pag    1
>
>  -------------------------------------------------------------------------------
>
>  OBJETIVO
>  DA ORDEM.....:   ADICIONAR INFORMAÇÕES
>
>
>
>
>  REGISTRO DO
>  AUTOR:   112200  FULANO DE TAL
>
>
>
>  Data Descr.:   02/01/2014
>  Hora Descr.:   11:22:55
>
>
>
>
>  Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
>  CONT
> VOLTA
>
> Então, quando o expect lê esse print, que é um texto puro carregado na
> tela (ou na memória) procuro pelas strings que necessito analisar e chamo
> uma subrotina específica para cada caso.
> Ex.:
>
> Para o caso 1, procuro pela string "SELECIONE" e disparo a sub normal();
> Para o caso 2, procuro pela string "OBJETIVO" e disparo a sub obj();
>
> Cada sub por sua vez, executará uma série de comandos distintos de
> integração com o IBM. Quando executo o perl/expect isoladamente para cada
> caso, tudo funciona conforme o esperado. O meu problema começa quando crio
> um único perl, com a estrutura abaixo (fiz isso baseando na documentação do
> expect - http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod):
>
> $exp->expect(2,
>               [ qr/\s+SELECIONE(.+)/ => \&normal()],
>               [ qr/\s+OBJETIVO(.+)/ => \&obj()],
>               [ qr/USUARIO nao autorizado/ => \&cancela()],
>
>               [ timeout => \&cancela() ],
>               );
>
> Que deveria executar, no meu leigo entendimento apenas uma chamada de
> subrotina para cada caso de match acima. O que está acontecendo é que o
> exp/perl está chamando todas as sub acima, independente do match.
>
>
> Alguém saberia me explicar como funciona a estrutura abaixo, copiada da
> página do expect? Como ela funciona? Vejam  o que diz a documentação:
>
> Furthermore, patterns can now be specified as array refs containing
> [$regexp, sub { ...}, @optional_subprams] . When the pattern matches, the
> subroutine is called with parameters ($matched_expect_obj,
> @optional_subparms). The subroutine can return the symbol `exp_continue' to
> continue the expect matching with timeout starting anew or return the
> symbol `exp_continue_timeout' for continuing expect without resetting the
> timeout count.
>
>  $exp->expect($timeout,
>               [ qr/username: /i, sub { my $self = shift;
>                                        $self->send("$username\n");
>                                        exp_continue; }],
>               [ qr/password: /i, sub { my $self = shift;
>                                        $self->send("$password\n");
>                                        exp_continue; }],
>               $shell_prompt);
>
> Essa estrutura chamará todas as sub na sequência? O que devo fazer para
> ajustar meu código? Onde estou errando? Como adequar as estruturas acima
> para chamar apenas uma sub rotina dependendo do match da string?
>
>
> Desde já agradeço,
> Muito obrigado,
> Atte.,
> Frederico
>
>
> 2014-04-19 22:35 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>
> Monges mestres! Obrigado pelo apoio e atenção! Estou com acesso restrito
>> e, assim que der retorno com detalhes.
>>
>> Márcio, espero que vc melhore! Realmente você havia iniciado esse tema de
>> integração há algum tempo e foi por ele que iniciei meu projeto. Obrigado
>> pelo apoio! O Eden tb ajudou demais! Agora tou emperrado...
>>
>> Atte,
>> Frederico
>>
>>
>> On Thursday, April 17, 2014, Tiago Peczenyj <tiago.peczenyj at gmail.com>
>> wrote:
>>
>>> se o cara vai ler da stdin ( e estamos admitindo que o cara fez um pipe
>>> para o script ) ok, mas o Expect te dá apenas a opção de controlar o
>>> timeout com processo como também é bidirecional.
>>>
>>> sem saber mais detalhes fica impossivel ajudar.
>>>
>>> 2014-04-17 17:33 GMT-03:00 Daniel de Oliveira Mantovani <
>>> daniel.oliveira.mantovani at gmail.com>:
>>>
>>> Oxi, você pode fazer isso sem usar expected....
>>>
>>> given(<STDIN>) {
>>>
>>> }
>>>
>>> 2014-04-17 17:31 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>>> > Oi Daniel,
>>> >
>>> > Preciso do expect pois vou interagir com o servidor. E analiso o que
>>> esse
>>> > servidor escreve em uma tela para tomar a decisão do próximo passo...
>>> >
>>> > A estrutura que você sugeriu é legal mas, acho que só interagindo
>>> dentro do
>>> > perl.
>>> >
>>> > Obrigado,
>>> >
>>> >
>>> > 2014-04-17 17:17 GMT-03:00 Daniel de Oliveira Mantovani
>>> > <daniel.oliveira.mantovani at gmail.com>:
>>> >
>>> >> Porque você quer usar expected ? (Seja lá o que esse método que você
>>> >> não especificou de onda venha faz).
>>> >>
>>> >>            given ($text) {
>>> >>                obj() when /OBJETIVO/;
>>> >>                consulta() when /CONSULTA/;
>>> >>            }
>>> >>
>>> >> 2014-04-17 17:01 GMT-03:00 Tiago Peczenyj <tiago.peczenyj at gmail.com>:
>>> >> > nunca usei assim mas baseado neste documento:
>>> >> >
>>> >> > http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod
>>> >> >
>>> >> > vc teria que usar o exp_continue no fim de cada subrotina.
>>> >> >
>>> >> >
>>> >> > 2014-04-17 16:58 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>>> >> >>
>>> >> >> Monges! Socorro!
>>> >> >> Sou bem limitado na programação em perl mas estou evoluindo com o
>>> >> >> tempo.
>>> >> >> Então desculpem pelas minhas dúvidas que para vocês, pode ser muito
>>> >> >> simples...
>>> >> >>
>>> >> >> Bom, estou utilizando expect com perl e analiso alguns outputs de
>>> um
>>> >> >> servidor, em forma texto, que devo analisar e, dependendo da
>>> ocorrência
>>> >> >> de
>>> >> >> uma string, devo disparar uma determinada sub-rotina para
>>> tratativas
>>> >> >> específicas.
>>> >> >>
>>> >> >> Ex.: se aparecer a string CONSULTA, devo disparar a subrotina
>>> >> >> consulta()
>>> >> >> Se aparecer a string OBJETIVO, devo disparar a subrotina obj() e
>>> assim
>>> >> >> por
>>> >> >> diante.
>>> >> >>
>>> >> >> O output do servidor é verificado pelo expect e, no momento que
>>> devo
>>> >> >> tomar
>>> >> >> a decisão, a tela do output é apenas uma, com apenas uma das
>>> >> >> ocorrências
>>> >> >> abaixo.
>>> >> >>
>>> >> >> Para verificar isso, estruturei o código .pl assim:
>>> >> >>
>>> >> >> $exp->expect(2,
>>> >> >>
>>> >> >>               [ qr/SELECIONE/ => \&select()],
>>> >> >>
>>> >> >>               [ qr/OBJETIVO/ => \&obj()],
>>> >> >>
>>> >> >>               [ qr/AGUARDE/ => \&sai_6()],
>>> >> >>
>>> >> >>               [ qr/CONSULTA/ => \&consulta()],
>>> >> >>
>>> >> >>               [ timeout => \&cancela() ],
>>> >> >>
>>> >> >>               );
>>> >> >>
>>> >> >> Ou seja, no meu entendimento limitado, quero que o expect dispare
>>> uma
>>> >> >> das
>>> >> >> subs acima dependendo da string que ele encontrar no output do
>>> >> >> servidor.
>>> >> >>
>>> >> >> Acredito que a estrutura acima, que parece uma matriz (desculpem a
>>> >> >> ignorância), vai executar TODAS as subs independente do conteúdo do
>>> >> >> output
>>> >> >> do servidor.
>>> >> >>
>>> >> >> O que está acontecendo é que o expect ou o perl só dispara a
>>> primeira
>>> >> >> sub... select()... independente da string encontrada...
>>> >> >>
>>> >> >> Sei que a condição para encontrar as strings funcionam pois, fiz um
>>> >> >> perl
>>> >> >> com expect para cada condição acima e, quando rodo individualmente
>>> cada
>>> >> >> .pl,
>>> >> >> funciona certo... o que estou errando? Como devo fazer o que
>>> preciso?
>>> >> >>
>>> >> >> Por favor, ajude
>>>
>>>
>>>
>>>
>>> --
>>> Tiago B. Peczenyj
>>> Linux User #405772
>>>
>>> http://about.me/peczenyj
>>>
>>
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20140422/d05b3483/attachment-0001.html>


More information about the SaoPaulo-pm mailing list