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