|
From: mike n. <xmi...@gm...> - 2017-03-25 19:49:35
|
Hello again, Bob,
Did you truly intend to re-send the same email from yesterday? Were you
able to test those previous suggestions?
Thanks kindly!
On Mar 25, 2017 8:50 AM, "McGowan Jr, Bob" <bob...@sa...> wrote:
> Hello List,
>
> I'm supporting legacy code that uses Expect, but I'm no expert at this
> tool. Nor can I figure out a way to pose the question to the archive
> server to search for anything helpful, so here I am, hoping for an answer.
>
> Also, I have not signed up to the list, since I hopefully will have no
> future needs in this arena. So please reply all.
>
> Before the section that does the Expect processing, below, there is a sub
> defined as follows:
>
> $passHandler = sub {
> my ($ssh, $logging, $password) = @_;
> $ssh->log_file(undef);
> $ssh->stty(qw(-echo));
> print $ssh "$password\r";
> $ssh->stty(qw(echo));
> $pat = quotemeta($password);
>
> $ssh->expect(0, '-re', "$pat");
>
> $ssh->log_file(\&logMethod) if $logging;
> return $ssh->error();
> };
>
> There are a number of other patterns to look for besides the two prompts
> listed below, each with appropriate logic contained in other 'sub'
> definitions. My problem is with the second prompt. Also, I'm not being
> pedantic here about format or syntax, this is not intended to run
> (currently).
>
> $expectObj->expect($timeout,
> '-re', $prompt1, sub {
> $failed = $passHandler($ssh, $logging,
> $password);
> if ($failed) {
> return "something";
> } else {
> return exp_continue_timeout();
> }
> },
> '-re', $prompt2, sub {
> $output = $ssh->exp_before();
> if ($secondPass) {
> $failed = $passHandler($ssh,
> $logging, $password);
> if ($failed) {
> return 'something';
> } else {
> return
> exp_continue_timeout();
> }
> } else {
> return # an error
> }
> },
> ...
> );
>
> I have run the original code with debugging on.
>
> Processing $prompt1 happens before processing for $prompt2. $prompt1 is
> the login prompt passed through by 'ssh'.
>
> Handling the ssh login step is works fine.
>
> Processing the second prompt looks for a string like 'Enter secondary
> password: ' which is detected correctly and processing goes into the
> passHandler, where the password is sent.
>
> The function then does the 'expect' on the password "pattern", which is
> there to be sure we don't get any echo'ed password passed through.
>
> But in the failing case, there is no password echoed, and the next set of
> returned strings contains stuff that doesn't match, within the
> passHandler. So it times out.
>
> Upon returning to the enclosing 'expect' call, expect immediately begins
> 'waiting' for new data. The strings that were picked up in passHandler are
> not looked at, and unfortunately they have the next string being 'waited'
> for, so the whole thing times out and processing fails.
>
> I'm happy to try to make something that actually runs, if that is needed,
> but that will take a bit more time and I hope this is enough to point
> someone in the right direction.
>
> Many thanks,
>
> Bob
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Expectperl-discuss mailing list
> Exp...@li...
> https://lists.sourceforge.net/lists/listinfo/expectperl-discuss
>
|