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].
|