From: Alex H. <ale...@gm...> - 2011-07-13 06:19:49
|
Hi list, I figured this out. Turned out to be host was sending 'Re-enter new Password' as the prompt with an upper case P and seems no matter how many times I looked at it I couldn't see the typo. Best regards, Alex On 10 July 2011 22:26, Alex Harvey <ale...@gm...> wrote: > Hi list, > > I am trying to write my first Expect Perl script and have run into a wall > and wonder if someone can help. > > The script is supposed to connect to the console of a Solaris firewall, > enter the existing password, change the password to a new one, and then > logout and disconnect. > > Here is the code, which is based on the example from the CPAN home page: > > #!/usr/bin/perl > > use warnings; > use strict; > > use Expect; > > my $exp = Expect->spawn("./emulate_console.sh") > or die "Cannot spawn command: $!\n"; > my $spawn_ok; > > my $newpass = 'YYYYYYYY'; > > $exp->expect( > 10, > [ > qr/for help.*$/ => sub { > $spawn_ok = 1; > my $fh = shift; > $fh->send("\r"); > exp_continue; > } > ], > [ > qr/login: $/ => sub { > $spawn_ok = 1; > my $fh = shift; > $fh->send("root\r"); > exp_continue; > } > ], > [ > qr/Password: $/ => sub { > $spawn_ok = 1; > my $fh = shift; > $fh->send("XXXXXXXX\r"); # send the current password > exp_continue; > } > ], > [ > eof => sub { > if ($spawn_ok) { > die "ERROR: premature EOF in login.\n"; > } else { > die "ERROR: could not spawn console.\n"; > } > } > ], > [ > timeout => sub { > die "No login.\n"; > } > ], > '-re', qr/# $/, # wait for shell prompt, then exit expect > ); > $exp->send("passwd root\r"); > $exp->expect( > 10, > [ > qr/New Password: $/ => sub { > my $fh = shift; > $fh->send("$newpass\r"); > exp_continue; > } > ], > [ > qr/Re-enter new password: $/ => sub { > my $fh = shift; > $fh->send("$newpass\r"); > exp_continue; > } > ], > ); > $exp->send("\cD"); # logout > $exp->send("\cEc."); # key sequence to disconnect from console > > Now emulate_console.sh is just a simple shell script that pretends to be > the server and prints the same text to the screen as the server's console > would. This shell script is not the issue, as I get more or less the same > result using the real server. > > The result I get is this: > > It logs in fine, and issues the 'passwd root' command. It sends the new > password and then sends it a second time at the 'Re-enter new password' > prompt. Then it just mysteriously stops. When using the emulate_terminal.sh > script, that script never sends any further output to the screen once the > second password is sent (which means I never see the root prompt that should > follow this). I get more or less the same result when I use the real server. > > I am pulling my hair out now so any hints would be most appreciated. Also > some example code would be much appreciated (as can probably be seen I > really don't know what I am doing. :) > > Best regards, > Alex Harvey > |