Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am using net::telnet to telnet to a node (nodeA), then run a few commands, and then telnet from that node (nodeA)to another node (nodeB). But, the login times out. You can only telnet to nodeB from nodeA. While on nodeA, all commands are accepted and there is output for proof. But, I cannot log into nodeB from nodeA. Is there something special that I must do ? nodeA and nodeB are both linux boxes. Thanks. -Peter

Replies are listed 'Best First'.
Re: telnet from telnet
by gam3 (Curate) on Apr 11, 2005 at 21:53 UTC
    I had lots of problems with your code. Here is what I got to work.
    use strict; use Net::Telnet; $b = Net::Telnet->new( Output_record_separator => '', Prompt => '/\$ $/', Timeout => 20, Host => 'localhost', ); $b->login("guest\n", "testme\n") or die "Connect failed: @{ $b->errmsg +() }\n"; my @output = $b->cmd("who\n"); print "out @output\n"; @output = $b->cmd(q[ perl -w <<EOP use Net::Telnet; my \$c = Net::Telnet->new( Errmode => 'return', Telnetmode => 1, Output_record_separator => '', Prompt => '/\\\$ $/', Timeout => 10, Host => 'localhost' ); \$c->login( "guest\n", "testme\n" ) or die "Connect failed: @{ \$c->errmsg() }\n"; my @output = \$c->cmd("who\n"); print "out @output\n"; EOP ]); print "out @output\n";
    You need to change 'localhost', 'guest', and 'testme'.

    UPDATE: did not have enought escaping. The prompt argument seems to be problematic.

    -- gam3
    A picture is worth a thousand words, but takes 200K.
      Thanks for your effort.
      But, the code does not work.
      I tried to print with the $c and it says cmd method not defined.
      But, as with the original code, you can print from
      from $b.
Re: telnet from telnet
by NateTut (Deacon) on Apr 11, 2005 at 18:47 UTC
    Show us the code you're using, tell us what OS(s) you're on and what error messages you're getting.
      my $currentNode1 = '123.45.6.890';
      my $userName1 = sprintf("name1\n");
      my $password1 = sprintf("password1\n");
      use Net::Telnet;
      $b = Net::Telnet->new( Errmode => 'return',
      Telnetmode => 1,
      Output_record_separator => '',
      Prompt => '/#/',
      Timeout => 70,
      Host => $currentNode );
      @results = $b->login($userName1, $password1) or die "Connect failed: @{ $b->errmsg() }\n";
      my $comString = sprintf("cd \/etc\/theDir\n");
      @output = $b->cmd($comString);
      my $currentNode2 = '123.45.6.892';
      my $userName2 = sprintf("name2\n");
      my $password2 = sprintf("password2\n");
      use Net::Telnet;
      $c = Net::Telnet->new( Errmode => 'return',
      Telnetmode => 1,
      Output_record_separator => '',
      Prompt => '/#/',
      Timeout => 70,
      Host => $currentNode2 );
      @results = $c->login($userName2, $password2) or die "Connect failed: @{ $c->errmsg() }\n";
      error message: Can't call method "login" on an undefined value at tMonitor.pl line 63.
      $currentNode2 is legitimate, but you can only access it from $currentNode1
      running from NT boxes to linux redhat version 7
      I appreciate all help.
      Thanks.
        The $c = Net::Telnet->new( is failing.
        -- gam3
        A picture is worth a thousand words, but takes 200K.
        That looks better

        I'm not a big Net::Telnet user, but it looks to me like $c is undefined. That means that Net::Telnet->new call failed. Also:

         Prompt => '/#/',

        looks suspicious to me. You might mean instead:

         Prompt => '#',

        Also I think you could change:
        my $userName2 = sprintf("name2\n"); my $password2 = sprintf("password2\n");
        To:
        my $userName2 = "name2\n"; my $password2 = "password2\n;
        Definately look into why $c is undefined...
      my $currentNode1 = '123.45.6.890'; my $userName1 = sprintf("name1\n"); my $password1 = sprintf("password1\n"); use Net::Telnet; $b = Net::Telnet->new( Errmode => 'return', Telnetmode => 1, Output_record_separator => '', Prompt => '/[#]/', Timeout => 70, Host => $currentNode ); @results = $b->login($userName1, $password1) or die "Connect failed: @ +{[ $b->errmsg() ]}\n"; my $comString = sprintf("cd \/etc\/theDir\n"); @output = $b->cmd($comString); my $currentNode2 = '123.45.6.892'; my $userName2 = sprintf("name2\n"); my $password2 = sprintf("password2\n"); use Net::Telnet; $c = Net::Telnet->new( Errmode => 'return', Telnetmode => 1, Output_record_separator => '', Prompt => '/[#]/', Timeout => 70, Host => $currentNode2 ); @results = $c->login($userName2, $password2) or die "Connect failed: @ +{[ $c->errmsg() ]}\n";
      error message: Can't call method "login" on an undefined value at tMo +nitor.pl line 63.
      $currentNode2 is legitimate, but you can only access it from $currentNode1

      running from NT boxes to linux redhat version 7

      I appreciate all help.

      Thanks.

      Janitored by Arunbear - added code tags, as per Monastery guidelines