<div dir="ltr"><div>Oi Hernan, obrigado pelo seu interesse. Na estrutura funcional que você enviou:<br><br>O expect só vai realizar as chamadas para as subs quando o match 
for verdadeiro? Ou ele vai executar linha por linha? Desculpe a 
ignorância... sorry...Se sim, será que as regex no meu código estão 
erradas? Por favor me ajude! Notei que no meu código, ele chama todas as subs, independente do regex... Será que todas estão retornando true? Obrigado!<br><br>Frederico<br><br><pre><div><pre><div>use Net::SSH2;</div>
<div>use Net::SSH2::Expect;<br></div></pre></div><div>sub add_user {</div><div>    my ( $self ) = @_; </div>
<div>    $exp->send("adduser $config->{ user }->{ username }\n");</div><div>    $exp->expect( 10, [</div><div>
        qr/Enter new UNIX password:/ => sub {</div><div>            my ($exp, $line) = @_;</div><div>            print $line;</div><div>
            $exp->send( $config->{ user }->{ password }."\n" );</div><div>        },</div><div>        qr|Retype new UNIX password:| => sub {</div>
<div>            my ( $exp, $line ) = @_; </div><div>            print $line;</div><div>            $exp->send( $config->{ user }->{ password }."\n" );</div>
<div>        },</div><div>        qr|Full Name| => sub {</div><div>            my ( $exp, $line ) = @_;</div>
<div>            print $line;</div><div>            $exp->send( "\n" );</div><div>        },</div>
<div>        qr|Room Number| => sub {</div><div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div>
<div>            $exp->send( "\n" );</div><div>        },</div><div>        qr|Work Phone| => sub {</div>
<div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div><div>            $exp->send( "\n" );</div>
<div>        },</div><div>        qr|Home Phone| => sub {</div><div>            my ( $exp, $line ) = @_;</div>
<div>            print $line;</div><div>            $exp->send( "\n" );</div><div>        },</div>
<div>        qr|Other| => sub {</div><div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div>
<div>            $exp->send( "\n" );</div><div>        },</div><div>        qr|Is the information correct| => sub {</div>
<div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div><div>            $exp->send( "Y\n" );</div>
<div>        },</div><div>    ]);</div><div>}</div></pre>Obrigado,<br></div><div>Frederico<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-04-22 10:09 GMT-03:00 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><pre>Esse exp_continue pode estar te atrapalhando, tenta comentar ele. <br><div><pre>Tenta o seguinte:<br>
</pre><br>$exp->expect(<br>    $timeout,<br>
    [<div class=""><br>        qr/username: /i,<br>        sub {<br>            my $self = shift;<br>            $self->send("$username\n");<br></div>            ///exp_continue;<div class=""><br>          }<br>
    ,<br>        qr/password: /i,<br>
        sub {<br>            my $self = shift;<br>            $self->send("$password\n");<br></div>            ///exp_continue;<br>          }<br>    ]<br>);<br><br></div><div>
<br></div><div><br><br></div><div>Segue um exemplo funcional:<br><br><pre><div>use Net::SSH2;</div>
<div>use Net::SSH2::Expect;<br></div></pre></div><div>sub add_user {</div><div>    my ( $self ) = @_; </div>
<div>    $exp->send("adduser $config->{ user }->{ username }\n");</div><div>    $exp->expect( 10, [</div><div>
        qr/Enter new UNIX password:/ => sub {</div><div>            my ($exp, $line) = @_;</div><div>            print $line;</div><div>
            $exp->send( $config->{ user }->{ password }."\n" );</div><div>        },</div><div>        qr|Retype new UNIX password:| => sub {</div>
<div>            my ( $exp, $line ) = @_; </div><div>            print $line;</div><div>            $exp->send( $config->{ user }->{ password }."\n" );</div>
<div>        },</div><div>        qr|Full Name| => sub {</div><div>            my ( $exp, $line ) = @_;</div>
<div>            print $line;</div><div>            $exp->send( "\n" );</div><div>        },</div>
<div>        qr|Room Number| => sub {</div><div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div>
<div>            $exp->send( "\n" );</div><div>        },</div><div>        qr|Work Phone| => sub {</div>
<div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div><div>            $exp->send( "\n" );</div>
<div>        },</div><div>        qr|Home Phone| => sub {</div><div>            my ( $exp, $line ) = @_;</div>
<div>            print $line;</div><div>            $exp->send( "\n" );</div><div>        },</div>
<div>        qr|Other| => sub {</div><div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div>
<div>            $exp->send( "\n" );</div><div>        },</div><div>        qr|Is the information correct| => sub {</div>
<div>            my ( $exp, $line ) = @_;</div><div>            print $line;</div><div>            $exp->send( "Y\n" );</div>
<div>        },</div><div>    ]);</div><div>}</div></pre></div><div class="gmail_extra"><br><br><div class="gmail_quote">
2014-04-22 9:57 GMT-03:00 Frederico Melo <span dir="ltr"><<a href="mailto:fdmmelo@gmail.com" target="_blank">fdmmelo@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">
<div dir="ltr">Pessoal,<br><br>Obrigado pelo interesse. Dando prosseguimento, e espero esclarecer melhor, tenho a seguinte situação:<br><br>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.<br>


<br>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:<br><br>1 - primeiro caso:<br><br> SELECIONE 'D' P/DETALHES<br>

  ADABAS11                   *** SUBSISTEMA DETALHES ***                    ADAB11<br>
  10/02/2014                     CONSULTA DE ORDEM                       09:07:30<br>  ORDEM  : 00ABC / AAAA                                                  Pag    1<br> OP ITEM             ORDEM<br>  _ DETALHES          CASAS DOMES    <br>


<br><br><br><br><br><br><br> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---<br>                                           -PAG  +PAG                    VOLTA<br><br>2 - segundo caso:<br><br>


<br>  ADABAS11                   *** SUBSISTEMA DETALHES ***                    ADAB11<br>  10/02/2014                     CONSULTA DE ORDEM                       09:11:30<br>  ORDEM  : 00DEF / AAAA                                                  Pag    1<br>


 -------------------------------------------------------------------------------<br> <br> OBJETIVO<br> DA ORDEM.....:   ADICIONAR INFORMAÇÕES<br> <br> <br> <br> <br> REGISTRO DO<br> AUTOR:   112200  FULANO DE TAL<br> <br>


 <br> <br> Data Descr.:   02/01/2014<br> Hora Descr.:   11:22:55<br> <br> <br> <br> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---<br> CONT                                                                    VOLTA<br>


<br>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.<br>Ex.:<br><br>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();<br>


<br>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 - <a href="http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod" target="_blank">http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod</a>):<br>


<br>$exp->expect(2,<br>              [ qr/\s+SELECIONE(.+)/ => \&normal()],<br>              [ qr/\s+OBJETIVO(.+)/ => \&obj()],<br>              [ qr/USUARIO nao autorizado/ => \&cancela()],<div>
<br>              [ timeout => \&cancela() ],<br>
              );<br><br></div>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.<br>


<br><br>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:<br><br>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.<br>


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


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


<br>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? <br><br>


<br>Desde já agradeço,<br>Muito obrigado,<br>Atte.,<br>Frederico<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-04-19 22:35 GMT-03:00 Frederico Melo <span dir="ltr"><<a href="mailto:fdmmelo@gmail.com" target="_blank">fdmmelo@gmail.com</a>></span>:<div>

<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Monges mestres! Obrigado pelo apoio e atenção! Estou com acesso restrito e, assim que der retorno com detalhes.<div><br>


</div><div>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... <br>



<div><br></div><div>Atte,</div><div>Frederico</div><div><div><div><br><br>On Thursday, April 17, 2014, Tiago Peczenyj <<a href="mailto:tiago.peczenyj@gmail.com" target="_blank">tiago.peczenyj@gmail.com</a>> wrote:<br>


</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><div><div>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.<br>


</div><div class="gmail_extra">


<br></div></div></div><div class="gmail_extra"><div><div>sem saber mais detalhes fica impossivel ajudar.<br><br><div class="gmail_quote">2014-04-17 17:33 GMT-03:00 Daniel de Oliveira Mantovani <span dir="ltr"><<a>daniel.oliveira.mantovani@gmail.com</a>></span>:<br>





<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oxi, você pode fazer isso sem usar expected....<br>
<br>
given(<STDIN>) {<br>
<br>
}<br>
<br>
2014-04-17 17:31 GMT-03:00 Frederico Melo <<a>fdmmelo@gmail.com</a>>:<br>
<div><div>> Oi Daniel,<br>
><br>
> Preciso do expect pois vou interagir com o servidor. E analiso o que esse<br>
> servidor escreve em uma tela para tomar a decisão do próximo passo...<br>
><br>
> A estrutura que você sugeriu é legal mas, acho que só interagindo dentro do<br>
> perl.<br>
><br>
> Obrigado,<br>
><br>
><br>
> 2014-04-17 17:17 GMT-03:00 Daniel de Oliveira Mantovani<br>
> <<a>daniel.oliveira.mantovani@gmail.com</a>>:<br>
><br>
>> Porque você quer usar expected ? (Seja lá o que esse método que você<br>
>> não especificou de onda venha faz).<br>
>><br>
>>            given ($text) {<br>
>>                obj() when /OBJETIVO/;<br>
>>                consulta() when /CONSULTA/;<br>
>>            }<br>
>><br>
>> 2014-04-17 17:01 GMT-03:00 Tiago Peczenyj <<a>tiago.peczenyj@gmail.com</a>>:<br>
>> > nunca usei assim mas baseado neste documento:<br>
>> ><br>
>> > <a href="http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod" target="_blank">http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod</a><br>
>> ><br>
>> > vc teria que usar o exp_continue no fim de cada subrotina.<br>
>> ><br>
>> ><br>
>> > 2014-04-17 16:58 GMT-03:00 Frederico Melo <<a>fdmmelo@gmail.com</a>>:<br>
>> >><br>
>> >> Monges! Socorro!<br>
>> >> Sou bem limitado na programação em perl mas estou evoluindo com o<br>
>> >> tempo.<br>
>> >> Então desculpem pelas minhas dúvidas que para vocês, pode ser muito<br>
>> >> simples...<br>
>> >><br>
>> >> Bom, estou utilizando expect com perl e analiso alguns outputs de um<br>
>> >> servidor, em forma texto, que devo analisar e, dependendo da ocorrência<br>
>> >> de<br>
>> >> uma string, devo disparar uma determinada sub-rotina para tratativas<br>
>> >> específicas.<br>
>> >><br>
>> >> Ex.: se aparecer a string CONSULTA, devo disparar a subrotina<br>
>> >> consulta()<br>
>> >> Se aparecer a string OBJETIVO, devo disparar a subrotina obj() e assim<br>
>> >> por<br>
>> >> diante.<br>
>> >><br>
>> >> O output do servidor é verificado pelo expect e, no momento que devo<br>
>> >> tomar<br>
>> >> a decisão, a tela do output é apenas uma, com apenas uma das<br>
>> >> ocorrências<br>
>> >> abaixo.<br>
>> >><br>
>> >> Para verificar isso, estruturei o código .pl assim:<br>
>> >><br>
>> >> $exp->expect(2,<br>
>> >><br>
>> >>               [ qr/SELECIONE/ => \&select()],<br>
>> >><br>
>> >>               [ qr/OBJETIVO/ => \&obj()],<br>
>> >><br>
>> >>               [ qr/AGUARDE/ => \&sai_6()],<br>
>> >><br>
>> >>               [ qr/CONSULTA/ => \&consulta()],<br>
>> >><br>
>> >>               [ timeout => \&cancela() ],<br>
>> >><br>
>> >>               );<br>
>> >><br>
>> >> Ou seja, no meu entendimento limitado, quero que o expect dispare uma<br>
>> >> das<br>
>> >> subs acima dependendo da string que ele encontrar no output do<br>
>> >> servidor.<br>
>> >><br>
>> >> Acredito que a estrutura acima, que parece uma matriz (desculpem a<br>
>> >> ignorância), vai executar TODAS as subs independente do conteúdo do<br>
>> >> output<br>
>> >> do servidor.<br>
>> >><br>
>> >> O que está acontecendo é que o expect ou o perl só dispara a primeira<br>
>> >> sub... select()... independente da string encontrada...<br>
>> >><br>
>> >> Sei que a condição para encontrar as strings funcionam pois, fiz um<br>
>> >> perl<br>
>> >> com expect para cada condição acima e, quando rodo individualmente cada<br>
>> >> .pl,<br>
>> >> funciona certo... o que estou errando? Como devo fazer o que preciso?<br>
>> >><br>
>> >> Por favor, ajude</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><div>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://about.me/peczenyj" target="_blank">http://about.me/peczenyj</a>
</div></div></div>
</blockquote></div></div>
</blockquote></div></div></div><br></div>
<br></div></div><div class="">=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></div></blockquote></div><br></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>