Pregunta

Puedo configurar una conexión Telnet en Perl sin problemas, y acabo de descubrir maldiciones, y me pregunto si puedo usar los dos juntos para raspar la salida de la sesión de Telnet.

Puedo ver en una fila, la base de columna el contenido de stdout usando el script simple a continuación:

use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";

Y usando el siguiente puedo abrir una conexión Telnet y enviar Recibir comandos sin problemas:

use net::telnet;
my $telnet = new Net::Telnet (Timeout => 9999,);
$telnet->open($ipaddress) or die "telnet open failed\n";
$telnet->login($user,$pass);
my $output = $telnet->cmd("command string");

... Pero lo que realmente me gustaría hacer es obtener la respuesta de Telnet (que incluirá caracteres de control de terminal) y luego buscar en una base de fila con Cursos. ¿Alguien sabe de una manera que pueda conectar a los dos? Me parece que las maldiciones solo pueden funcionar en stdout

¿Fue útil?

Solución

Estas buscando Término :: VT102, que emula un terminal VT102 (convirtiendo los caracteres de control terminal en un estado de pantalla virtual). Hay un ejemplo que muestra cómo usarlo con Net :: telnet en VT102/ejemplos/telnet-usage.pl (El directorio de ejemplos está dentro del directorio VT102 por alguna razón).

Han pasado unos 7 años desde que utilicé esto (el sistema que estaba automatizando se cambió a una interfaz basada en la web), pero solía funcionar.

Otros consejos

Maldiciones hace lo contrario. Es una biblioteca C para optimizar las actualizaciones de pantalla de un programa que escribe a un terminal, originalmente diseñado para usarse a través de una conexión en serie lenta. No tiene capacidad para raspar un diseño de una secuencia de caracteres de control.

Una mejor apuesta sería un emulador terminal que tiene una API con la capacidad de hacer este tipo de raspado de pantalla. Fuera de mi cabeza, no estoy seguro de si algún emulador de terminal de código abierto hace esto, pero ciertamente hay los comerciales disponibles que pueden.

Probablemente quieras algo como Suponer

use strict;
use warnings;

use Expect;

my $exp = Expect->spawn("telnet google.com 80");

$exp->expect(15, #timeout
        [
                qr/^Escape character.*$/,
                sub {
                        $exp->send("GET / HTTP/1.0\n\n");
                        exp_continue;
                }
        ]
);

Si está interactuando puramente con comandos y respuestas de texto sencillo, puede usar Suponer Para escribir eso, de lo contrario, puede usar Término :: VT102, que le permite a las aplicaciones de raspado (lea partes específicas de la pantalla, envía texto, maneja eventos sobre desplazamiento, movimiento del cursor, cambios de contenido de pantalla y otras) utilizando secuencias de escape VT102 para el control de la pantalla (por ejemplo, una aplicación que usa la biblioteca de Curses) .

O podrías usar el guion comando para esto.

De la página de Solaris Man:

DESCRIPCIÓN

los script La utilidad hace un registro de todo lo impreso en su pantalla. El registro está escrito en Nombre del archivo. Si no se da el nombre del archivo, el registro se guarda en el archivo mecanografiado...

El comando de script bifurca y crea una subheca, de acuerdo con el valor de $ shell, y registra el texto de esta sesión. El script termina cuando sale la carcasa bifurcada o cuando se escribe el control-D.

También votaría por la respuesta esperada. Tuve que hacer algo similar desde una aplicación gui'ish. El truco (aunque tedioso) para evitar a los personajes de control fue quitar a todos los personajes miscelados de las cuerdas devueltas. Depende de cuán desordenado el raspado de la pantalla termina siendo.

Aquí está mi función de ese script como ejemplo:

# Trim out the curses crap
sub trim {
    my @out = @_;
    for (@out) {
        s/\x1b7//g;
        s/\x1b8//g;
        s/\x1b//g;   # remove escapes
        s/\W\w\W//g;
        s/\[\d\d\;\d\dH//g;  # 
        s/\[\?25h//g;
        s/\[\?25l//g;
        s/\[\dm//g;
        s/qq//g;
        s/Recall//g;
        s/\357//g;
        s/[^0-9:a-zA-Z-\s,\"]/ /g;
        s/\s+/ /g;    # Extra spaces

    }
    return wantarray ? @out : $out[0];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top