in reply to Losing my mind with Net::OpenSSH and Expect

The following script works for me:
#!/usr/bin/perl use strict; use warnings; use Net::OpenSSH; use Expect; my $host = $ARGV[0]; my $pass1 = $ARGV[1]; my $pass2 = $ARGV[2]; my $ssh = Net::OpenSSH->new($host, passwd => $pass1); $ssh->error and die "unable to connect to remote host: " . $ssh->error +; my ( $pty, $pid ) = $ssh->open2pty("sudo -kp 'configtest:' bash 2>&1") or return "failed to attempt sudo bash: $!\n"; my $expect = Expect->init($pty); $expect->expect(2, [ qr/configtest:/ => sub { my $expect =shift; $expect->send($p +ass2 . "\n"); exp_continue;} ], [ qr/Sorry/ => sub { my $expect=shift; print "Failed\n"; e +xp_continue; } ], ); $expect->interact();
Can you try it?

Which OpenSSH version and OS are you using?

Replies are listed 'Best First'.
Re^2: Losing my mind with Net::OpenSSH and Expect
by rastoboy (Monk) on Feb 28, 2011 at 23:54 UTC
    Hi Salva,

    Thanks for the response. When I did it just as you said, I got:

    fcntl returned undef during exp_init of Expect=GLOB(0x97b1760), Bad fi +le descriptor
    I had had issues trying to include the -k in the sudo command, so I made it a separate $ssh->system() call, and it does seem to work except that I have to hit Enter for it to go into interactive mode. Sounds trivial, I know, but I'm hitting rather a lot of machines.

    If I get rid of exp_continue after sending the password, it goes straightaway. Unfortunately, if it fails it doesn't catch the "Sorry", and just prompts me for a password. So it's a catch-22.

    I'll be darned if I can detect a substantive difference between your code and mine, too, beyond what I've mentioned!

    I'm on Ubuntu 10 and OpenSSH:
    OpenSSH_5.5p1 Debian-4ubuntu5, OpenSSL 0.9.8o 01 Jun 2010

      For clarity, when I moved the -k out of the open2pty call, I got rid of the new error message. So it's interesting that you didn't have that issue.

        I had had issues trying to include the -k in the sudo command

        The -k switch may be a recent addition to sudo not yet available in the version you have installed.

        and it does seem to work except that I have to hit Enter for it to go into interactive mode

        You are already in interactive mode but you don't notice it because Expect is eating the shell prompt. Try the following script:

        #!/usr/bin/perl use strict; use warnings; use Net::OpenSSH; use Expect; my $host = $ARGV[0]; my $pass1 = $ARGV[1]; my $pass2 = $ARGV[2]; my $ssh = Net::OpenSSH->new($host, passwd => $pass1); $ssh->error and die "unable to connect to remote host: " . $ssh->error +; $ssh->system("sudo -K"); my ( $pty, $pid ) = $ssh->open2pty({stderr_to_stdout => 1}, 'sudo', -p + => 'configtest:', 'bash', '-i') or return "failed to attempt sudo bash: $!\n"; my $expect = Expect->init($pty); $expect->expect(2, [ qr/configtest:/ => sub { shift->send("$pass2\n"); ex +p_continue;} ], [ qr/Sorry/ => sub { die "Login failed" } ], [ qr/.*#\s+/ => sub { print shift->match }] ) or die "Timeout!"; $expect->interact();