in reply to Net::OpenSSH multiple commands

After a few more days of messing with this, I have gotten the following code to work.

#!/usr/bin/perl use strict; use warnings; use diagnostics; use Net::OpenSSH; use Expect; my $host = '10.0.0.1'; my $ssh = Net::OpenSSH->new("$host", timeout => 30); $ssh->error and die "unable to connect to remote host: ". $ssh->error; my ($pty,$pid) = $ssh->open2pty or die "unable to run remote command show ip arp"; my $output = $ssh->capture({stdin_data => "term length 0\nterm width 512\nsh ver\nsh run\nexit\n"}); print $output;

This code, however, gives me 2 errors...

Pseudo-terminal will not be allocated because stdin is not a terminal. channel 4: open failed: resource shortage:

I have tried searching for a fix for them but I haven't found anything.

Would anyone know how I can fix these errors?

Replies are listed 'Best First'.
Re^2: Net::OpenSSH multiple commands
by salva (Canon) on Apr 24, 2012 at 09:31 UTC
    The line ...
    my ($pty,$pid) = $ssh->open2pty or die "unable to run remote command show ip arp";
    ... does mostly nothing, delete it.
    This code, however, gives me 2 errors

    Those are probably harmless, generated by OpenSSH because you are requesting a remote pty but attaching it to a non-pty stream.

    BTW, when writing follow ups to previous comments, do not reply to main question but to those, otherwise the person you are responding (i.e. me) will probably miss the reply.

      I removed the line:(for which I just realized that I had forgot to change "show ip arp")

      my ($pty,$pid) = $ssh->open2pty or die "unable to run remote command show ip arp";

      and the results were that the "channel 4: open failed: resource shortage:" error went away. As for the remaining error, I guess i'll just filter it out since it's probably harmless as you said.

      I appreciate the tip on writing follow ups, I never realized that it could cause that. Now I have a much more solid solution compared to using the Net::SSH::Expect module. For those interested, I cleaned up my code:...

      #!/usr/bin/perl use strict; use warnings; use Net::OpenSSH; my $host = '10.0.0.1'; my $ssh = Net::OpenSSH->new("$host", timeout => 30); $ssh->error and die "unable to connect to remote host: ". $ssh->error; my $output = $ssh->capture({stdin_data => "term length 0\nterm width 512\nsh ver\nsh run\nexit\n"}); print $output;

      Thank you Salva

      Hi Salva, I believe you are probably the best person to answer this:... I changed the line:

      my $output = $ssh->capture({stdin_data => "term length 0\nterm width 512\nsh ver\nsh run\nexit\n"});

      to this:

      my @Output = $SSH->capture({stdin_data => "terminal length 0\nterminal width 512\nshow ip accounting\nexit\n"});

      and I get an error (I think might be caused by openssh) that says "Bad packet length 688328622." (The length numbers change every time I run the code). If i remove some parts of the commands such as "terminal length 0" and run it again, the error goes away. The same goes if I leave "terminal length 0" in there and replace say "show ip accounting" by "show ip route".(no error)

      So it seems that a combination of commands will trigger this error. I do have to say though that the output is ok regardless of the error. Would this be another error which I should Ignore? or could this be a bug?

      Thanks

        This looks like a bug on the router SSH stack. Try to replicate it running the following command from the command line in order to discard Perl or Net::OpenSSH as the cause of the problem.
        ssh router <<EOC terminal length 0 terminal width 512 show ip accounting exit EOC

        I guess the malfunction is caused by some buffer overflow on the remote shell that is triggered by the longer command line.