Search code examples
perltelnet

Perl Net::Telnet retrieving single line of output


Using Perl's Net::Telnet module to retrieve data from upsd. There is one particular function I'm trying to implement, retrieving the data for a single var. The problem is only a single line is output, and that line is used to match Prompt, so it is not output.

Here's raw telnet:

telnet dns1 3493
Trying 192.168.15.1...
Connected to dns1.
Escape character is '^]'.
get var cp1500 ups.test.result
VAR cp1500 ups.test.result "Done and passed"
Connection closed by foreign host.

Here's some code:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Telnet;

my $host = "dns1";
my $model = "cp1500";
my $bvar = "ups.test.result";
my $t = new Net::Telnet (Timeout => 3, Port => 3493, Prompt => "/VAR $model $bvar/");
$t->open($host);
my @ary = $t->cmd("get var $model $bvar");
print @ary,"\n";

This just prints the newline as the array is empty. Prompt is matched else there'd be a timeout error. How can I get that single line of output back for processing in the script?


Solution

  • This is my solution, use Socket instead of Net::Telnet.

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Socket;
    
    my $host = 'str003';
    my $port = 3493;
    my $model = 'cp1350';
    my $quer = 'get var';
    my $bvar = 'ups.test.result';
    my ($sock,$iaddr,$paddr,$send);
    $iaddr = inet_aton($host);
    $paddr = sockaddr_in($port, $iaddr);
    $send = join(' ',$quer,$model,$bvar);
    socket($sock, AF_INET, SOCK_STREAM, 6) or die $!;
    connect($sock , $paddr) or die "connect failed : $!";
    send($sock , "$send\nlogout\n" , 0);
    while (my $line = <$sock>)
    {
      if ($line =~ /^VAR/) {
        print "$line\n";
      }
    }
    close($sock);
    

    This is the one where one line of data is returned:

    VAR cp1350 ups.test.result "Done and passed"