Pergunta

Posso configurar uma conexão telnet no Perl sem problemas e acaba de descobrir maldições e estou me perguntando se posso usar os dois para raspar a saída da sessão Telnet.

Eu posso visualizar em uma linha, em coluna, o conteúdo do stdout usando o script simples abaixo:

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

E usando o abaixo, posso abrir uma conexão Telnet e enviar comandos recebem sem 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");

... Mas o que eu realmente gostaria de fazer é obter a resposta Telnet (que incluirá caracteres de controle de terminal) e, em seguida, pesquisar em uma linha coluna usando maldições. Alguém sabe de uma maneira de conectar os dois juntos? Parece -me que as maldições só podem operar no stdout

Foi útil?

Solução

Você está procurando Termo :: VT102, que emula um terminal VT102 (convertendo os caracteres de controle do terminal em um estado de tela virtual). Há um exemplo mostrando como usá -lo com Net :: telnet dentro Vt102/exemplos/telnet-usage.pl (O diretório de exemplos está dentro do diretório VT102 por algum motivo).

Faz cerca de 7 anos que eu usei isso (o sistema que eu estava automatizando mudou para uma interface baseada na Web), mas costumava funcionar.

Outras dicas

Maldições faz o oposto. É uma biblioteca C para otimizar atualizações de tela de um programa que escrevem para um terminal, originalmente projetado para ser usado em uma conexão serial lenta. Não tem capacidade de raspar um layout de uma sequência de caracteres de controle.

Uma aposta melhor seria um emulador de terminal que possui uma API com a capacidade de fazer esse tipo de raspagem de tela. No topo da minha cabeça, não tenho certeza se algum emuladores de terminal de código aberto fazem isso, mas certamente existem comerciais disponíveis.

Você provavelmente quer algo como Espero

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;
                }
        ]
);

Se você estiver interagindo puramente com comandos e respostas de texto simples, você pode usar Espero Para escrever isso, caso contrário, você pode usar Termo :: VT102, que permite a tela (Leia partes específicas da tela, enviar texto, lidar com eventos de rolagem, movimento do cursor, alterações de conteúdo da tela e outros aplicativos usando sequências de escape VT102 para controle de tela (por exemplo, um aplicativo usando a biblioteca de maldições) .

Ou você pode usar o roteiro comando para isso.

Da página do homem solaris:

DESCRIÇÃO

o script O utilitário faz um registro de tudo impresso na tela. O registro está escrito para nome do arquivo. Se nenhum nome de arquivo for fornecido, o registro será salvo no arquivo TypeScript...

O comando de script força e cria uma sub-concha, de acordo com o valor de $ shell, e registra o texto desta sessão. O script termina quando a concha bifurcada sai ou quando o Control-D é digitado.

Eu votaria também pela resposta de espera. Eu tive que fazer algo semelhante a partir de uma aplicação gui. O truque (embora tedioso) para contornar os personagens de controle era tirar todos os personagens dos Misc das cordas devolvidas. Depende de quão bagunçada a tela acaba sendo.

Aqui está minha função desse script como exemplo:

# 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top