Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Net::Telnet::Options example code

by castaway (Parson)
on Oct 14, 2005 at 22:23 UTC ( [id://500391]=sourcecode: print w/replies, xml ) Need Help??
Category: Networking code
Author/Contact Info jrobinson@cpan.org
Description: An example of how to use Net::Telnet::Options, here for peer review, will be added to the tarball.
#!/usr/bin/perl

use strict;
use warnings;

use IO::Socket::INET;
use IO::Select;
use Net::Telnet::Options;

## Settings:
my $username = 'foo';
my $password = 'foobar';

## Create an internet socket to connect to our server
my $telnet = IO::Socket::INET->new( PeerAddr => 'my.host.name',
                                    PeerPort => 23,
                                    Proto    => 'tcp',
                                    Timeout  => 60 ) or
    die "Can't connect to my.host.name ($!)";

## Create a Net::Telnet::Options object
my $telnetopts = Net::Telnet::Options->new();

## Write a sub that will be called when the server asks us about our t
+erminal
## type.

sub ttype_sb_callback
{
    ## This module will be called with the suboption command, the cont
+ent of 
    ## the option, the data in this line, and the position of the subo
+ption
    ## in the data.
    ## 
    ## The command can have one of three values:
    ## "SEND" - Please send me an answer for this option
    ## "IS"   - Here are the values you asked for
    ## "SB"   - Neither SEND or IS were specified, some buggy options 
+do this!
    ## 
    ## The option content is an empty string for SEND (since it is a c
+ommand),
    ## contains the passed values for IS, and the entire command for S
+B
    ##
    ## Both the data and the pos arguments are there "just in case" an
+d are
    ## usually not needed.

    my ($cmd, $content, $data, $pos) = @_;

    if($cmd eq 'SEND')
    {
        ## Server is asking us for our terminal type, we need to send
        ## a suboption IS reply, to our telnet socket.

        $telnetopts->sendOpt($telnet, 'SB', 'TTYPE', 'IS', 'VT100');  
+ 
    }   
}

## acceptDoOption is called to define callbacks to call when the serve
+r
## asks us to DO something.
## The corresponding calls are: acceptWillOption, activeDoOption, 
## activeWillOption
## Either the name of the option, eg 'TTYPE', or its number (24), can 
+be used. 
## Each option is associated with a hashref of callbacks for the vario
+us 
## types of telnet option commands.
## Commands:
## WILL    - Called when the server accepts to do an option
## WONT    - Called when the server says no to an option
## DO      - Called when the server says do an option
## DONT    - Called when the server says dont do an option
## SB      - Called when the server sends a suboption reply or request
## RAW     - Called for commands that arent options, like EOR

$telnetopts->acceptDoOption('TTYPE' => {'SB' => \&ttype_sb_callback} )
+;

## Send any option requests we have set up
$telnetopts->doActiveOptions($telnet);

## Create an IO::Select object to tell us when we can read from the so
+cket.
## And add our telnet socket.
my $select = IO::Select->new();
$select->add($telnet);

## Start a neverending loop to use the socket
while(1)
{
    ## Check which handles (we have only one) have data ready for us.
    my ($handle) = $select->can_read();

    ## Get data from the socket, in 1024 byte chunks
    my $incoming;
    $handle->recv($incoming, 1024, 0);

    ## An empty string means our socket is closed.
    if(!$incoming)
    {
        print "Socket closed!\n";
        last;
    }

    ## Pass our data through the telnet options object, to let it
    ## read and respond to any options.
    $telnetopts->answerTelnetOpts($telnet);

    ## Use the rest of the data:
    if($incoming =~ /^login:/)
    {
        $telnet->print("$username\015\012");
    }
    elsif($incoming =~ /^Password:/)
    {
        $telnet->print("$password\015\012");
    }
#    elsif( .. )
#    {
#    }

    ## Loop around and repeat until done .. 

}

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: sourcecode [id://500391]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-24 01:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found