in reply to Re^4: Losing my mind with Net::OpenSSH and Expect
in thread Losing my mind with Net::OpenSSH and Expect

Man that's really weird. Success works pretty good, but failing gracefully is still my bugaboo. I still get the "Sorry" prompt, unless I change the key from a regex to a string match. And even then, if I don't have an actual "die" in the subroutine (that dies as it should), I still get the prompt. I don't really want the program to die, I just want to sever the connection and move on to the next machine, for example.

It makes me wonder if it isn't coming up in some other sort of context or something. I tried adding multiline and global match commands after the regex but Expect didn't like that at all:

Variable "$expect" is not imported at ./test.pl line 28. (Did you mean &expect instead?)
Very weird.

Replies are listed 'Best First'.
Re^6: Losing my mind with Net::OpenSSH and Expect
by salva (Canon) on Mar 02, 2011 at 09:46 UTC
    I don't really want the program to die

    Well, you can catch die's wrapping them inside and eval block. Or you can handle errors in a different way, for instance, using the return value from the expect method:

    my $r = $expect->expect(2, [ qr/configtest:/ => sub { shift->send("$pass2 +\n"); exp_continue;} ], [ qr/Sorry/ => sub { print "Login failed +\n" } ], [ qr/.*#\s+/ => sub { print shift->match +}] ); if (!defined $r) { print "Timeout!\n"; } elsif ($r == 3) { $expect->interact(); } else { print "Login failed!\n"; }
    Regarding the error you get:
    Variable "$expect" is not imported at ./test.pl line 28. (Did you mean &expect instead?)
    You have some error in your script but without seeing the source code it is difficult to say what! You are probably not declaring the variable $expect in the right scope.
      Thanks, Salva, I appreciate it! I'll get it sorted (the code is just too large and bulky to post). I'll start simple and work my way up :-)