Net::Telnet
use strict;
use Net::Telnet
# Crea l'oggetto Telnet
my $telnet = new Net::Telnet( -host => localhost);
# Eseguo il login
$telnet->login('utente','password');
Oppure, se il server non risponde chiedendo nel modo più classico login o username e password, è necessario "attendere" quanto il server chiede; ad esempio, se fosse necessaria solo la password, è sufficiente il codice seguente:
use strict;
use Net::Telnet
# Crea l'oggetto Telnet
my $telnet = new Net::Telnet( -host => localhost);
# Aspetto il testo che già conosco
$telnet->waitfor('/Password:.*/');
# Scrivo la password
$telnet->print('la_password');
Una volta instaurata la connessione è possibile mandare dati con vari metodi o eseguire in automatico delle routine qualora le impostazioni di telnet venissero modificate dal server.
#!/usr/bin/perl
use strict;
use Net::Telnet;
# Inizializzazione delle variabili
my ($hostname, $passwd, $username);
$hostname = '<indirizzo>'; # Sostituisci i valori con i tuoi dati
$username = '<username>';
$passwd = '<password>';
my ($pop, $line, $buffer);
$pop = new Net::Telnet (Telnetmode => 0); # Creiamo una nuova istanza dell'oggetto
# Il parametro Telnetmode indica
# se la connessione è di tipo Telnet
$pop->open(Host => $hostname, # Apriamo la connessione con l'host
Port => 110);
$line = $pop->getline; # Controlliamo la risposta del POP ed
die $line unless $line =~ /^\+OK/; # interrompiamo il programma a meno che la
# stringa ricevuta inizi con OK
$pop->print("user $username"); # Passiamo all'autenticazione
$line = $pop->getline; # inviando username e password e
die $line unless $line =~ /^\+OK/; # svolgendo gli stessi controlli
$pop->print("pass $passwd");
$line = $pop->getline;
die $line unless $line =~ /^\+OK/;
$pop->print("stat"); # Controlliamo il totale dei
$line = $pop->getline; # messaggi sul server
my ($ok, $numero_messaggi, $bytes_totali) = split /\s/, $line;
die $line unless $ok =~ /^\+OK/;
# Se nella casella di posta ci sono messaggi controlliamoli uno ad uno
if ($numero_messaggi > 0) {
# Definiamo la formattazione dell'intestazione e corpo del messaggio
my ($email, $oggetto, $messaggio);
printf( "\n%3d messaggi per un totale di %.2f K\n"
, $numero_messaggi, $bytes_totali / 1024);
# Per esaminare ogni messaggio, invece di controllare linea per linea evitando
# così la procedura precedente, sfruttiamo un metodo di Net::Telnet, cmd, che
# permette di eseguire un comando e redirezionare l'output in una reference
# precedentemente definita
$buffer = $pop->buffer; # Inizializza lo spazio dove il modulo salverà i dati
# Inizia il ciclo del controllo dei messaggi
for ($messaggio = 1;
$messaggio <= $numero_messaggi;
$messaggio++) {
# Esegui il metodo command impostando output alla reference inizializzata.
# Da notare anche il parametro prompt: una volta eseguito il comando il
# server pop restituisce un output differente a quella di un normale server
# telnet o ssh; mediante una espressione regolare è possibile inserire ogni
# forma di prompt possibile
$pop->cmd( string => "top $messaggio 0"
, output => $buffer
, prompt => "/\n\.\n/"
, timeout => 20);
# Con una regular expression estraiamo il risultato
my $header = $$buffer;
$header =~ /From:\s(.+?)\n.+?Subject:\s(.+?)\n/is;
$email = $1;
$oggetto = $2;
# Scrivi i risultati
printf("%03d | %s - %s\n", $messaggio, $email, $oggetto);
# Svuotiamo l'area di memoria per ricevere altri dati
$pop->buffer_empty;
}
# Se non ci sono messaggi
} else {
print "Nessun messaggio\n";
}
$pop->close;
exit;
In Net::Telnet è facile pure il debug: possibile errori durante la stesura del codice possono essere facilmente individuati salvando su disco l'input e l'output con metodi come [=input_log] ed [=outoput_log].
|