• Publicidad

Problema con "print" al mostrar contenido formateado en ANSI

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con "print" al mostrar contenido formateado en ANSI

Notapor pedrete » 2011-04-13 10:25 @476

Hola a todos... este es mi primer mensaje en el foro así que antes de nada ¡vaya por delante un atento saludo y agradecimiento a todo el mundo!

Estoy empezando a dar mis primeros pasos en Perl (con Linux) y me he encontrado con un problema que me trae de cabeza.

Estoy intentando programar un pequeño cliente que se conecte con mi router ADSL y lea la velocidad a la que va la línea en ese momento.

Si hago un telnet al router o uso el nc, veo el menú del router perfectamente. Esta formateado con texto en ANSI (creo) para colocar las diferentes opciones por diferentes lugares de la pantalla en plan bonito y cómodo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
                   Copyright (c) 1994 - 2006 ZyXEL Communications Corp.

                              P-660HW-D1 Main Menu

     Getting Started                      Advanced Management
       1. General Setup                     21. Filter Set Configuration
       2. WAN Backup Setup                  22. SNMP Configuration
       3. LAN Setup                         23. System Security
       4. Internet Access Setup             24. System Maintenance
                                            25. IP Routing Policy Setup
     Advanced Applications                  26. Schedule Setup
       11. Remote Node Setup
       12. Static Routing Setup
       14. Dial-in User Setup               99. Exit
       15. NAT Setup





                          Enter Menu Selection Number:
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sin embargo mi script de Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use IO::Socket;
  3. my $sock = new IO::Socket::INET (
  4.                                  PeerAddr => '192.168.1.1',
  5.                                  PeerPort => '23',
  6.                                  Proto => 'tcp',
  7.                                 );
  8. die "Could not create socket: $!\n" unless $sock;
  9. $sock->autoflush(1) ;
  10. while (<$sock>) { print "$_"} ;
  11. close($sock);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡¡¡no muestra el contenido del menú!!!

He comprobado con Wireshark si todo va bien y efectivamente el router entrega el texto del menú al socket pero hay algo que hace que "print" no lo muestre... (Mi sospecha es por estar formateado en ANSI...)

¿Alguien me puede dar alguna idea, por favor?

Muchísimas gracias...

Pedrete.
pedrete
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-04-13 09:59 @458

Publicidad

Re: Problema con "print" al mostrar contenido formateado en ANSI

Notapor explorer » 2011-04-14 07:39 @361

Bienvenido a los foros de Perl en español, pedrete.

Sí que podría ser debido a la presencia de caracteres de escape ANSI.

Fíjate que en el código que has publicado, en la línea 10, estás indicando que estás esperando por un carácter de fin de línea. Si el menú se genera por medio de caracteres normales, más un posicionamiento mediante caracteres de control, entonces nunca recibirás el carácter de fin de línea.

Podrías cambiar el operador <$sock> por read($sock, ...), para leer cada pocos bytes. O quizás más sencillo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. local $/; # indefinimos el carácter separador de registros (líneas), por lo que nos hacemos con toda la entrada
  2. print <$sock>; # vuelca a pantalla todo lo que nos devuelve, sea lo que sea
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Yo te recomiendo usar Net::Telnet, o, si existe, algún módulo específico para ese enrutador.

Por ejemplo, para acceder a un enrutador Huawei ADSL, se puede usar esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Net::Telnet ();
  7.  
  8. #$|++;    # Opcional: desactivamos el caché de salida
  9.  
  10. my $telnet = Net::Telnet->new(
  11.     Timeout => 10,
  12.     Host    => '192.168.1.1',
  13.     Port    => 23,
  14.     Binmode => 0,               # 0 o 1, dependiendo de cómo sean los caracteres finales de línea
  15.     Prompt  => '/ATP>/',        # Prompt inicial
  16. );
  17.  
  18. $telnet->open();
  19. print "Abierto\n";
  20.  
  21. $telnet->login('admin', 'admin');    # esta línea equivale a las cuatro siguientes
  22. #$telnet->waitfor('/login: $/i');
  23. #$telnet->print('admin');
  24. #$telnet->waitfor('/password: $/i');
  25. #$telnet->print('admin');
  26.  
  27. print "Registrado\n";
  28.  
  29. #print $telnet->dump_log();
  30.  
  31. print "Enviando help\n";
  32.  
  33. print $telnet->cmd("help");          # ejemplo de ejecución de un comando
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados