Frage

Ich kann eine Telnet -Verbindung in Perl ohne Probleme aufstellen und habe gerade Flüche entdeckt und frage mich, ob ich die beiden zusammen verwenden kann, um die Ausgabe aus der Telnet -Sitzung abzukratzen.

Ich kann eine Zeile ansehen, Spaltenbasis den Inhalt von STDOut mit dem einfachen Skript unten:

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

Und mit dem unten stehenden Telnet -Verbindung und mit kein Problem mit Empfangsbefehls senden:

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");

... aber ich möchte wirklich die Telnet -Antwort (die Terminalsteuerzeichen enthalten) und dann auf einer Zeile Spaltenbasis mit Flüchen suchen. Kennt jemand eine Art und Weise, wie ich die beiden miteinander verbinden kann? Es scheint mir, dass Flüche nur auf Stdout arbeiten können

War es hilfreich?

Lösung

Du schaust nach Begriff :: VT102, das einen VT102 -Terminal emuliert (die Terminalsteuerzeichen in einen virtuellen Bildschirmzustand umwandeln). Es gibt ein Beispiel, das zeigt, wie man es benutzt Netz :: Telnet in Vt102/Beispiele/telnet-uSage.pl (Das Beispielverzeichnis befindet sich aus irgendeinem Grund im VT102 -Verzeichnis).

Es ist ungefähr 7 Jahre her, seit ich dieses Gebrauch verwendet habe (das System, das ich automatisiert habe, um eine webbasierte Schnittstelle zu erreichen), aber früher funktionierte es.

Andere Tipps

Flüche tun das Gegenteil. Es handelt sich um eine C -Bibliothek zur Optimierung von Bildschirmaktualisierungen von einem Programm, das zu einem Terminal geschrieben wird, das ursprünglich für eine langsame serielle Verbindung verwendet wurde. Es hat keine Fähigkeit, ein Layout aus einer Folge von Kontrollzeichen abzukratzen.

Eine bessere Wette wäre ein Terminalemulator, der eine API hat, die diese Art von Screen -Scraping durchführen kann. Ich bin mir nicht sicher, ob irgendwelche Open-Source-Terminal-Emulatoren dies tun, aber es gibt sicherlich kommerzielle, die können.

Sie wollen wahrscheinlich so etwas wie Erwarten von

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

Wenn Sie nur mit Befehlen und Antworten auf einfache Textbefehle und Antworten interagieren, können Sie verwenden Erwarten von Um das zu skriptieren, können Sie ansonsten verwenden Begriff :: VT102, Mit dem Bildschirm Screape (Lesen Sie bestimmte Teile des Bildschirms, Senden Sie Text, handeln Sie Ereignisse für Scrollen, Cursorbewegungen, Bildschirminhaltsänderungen und andere) Anwendungen mithilfe von VT102 Escape -Sequenzen für die Bildschirmsteuerung (z. B. eine Anwendung mit der Flursbibliothek) .

Oder Sie könnten die verwenden Skript Befehl dafür.

Von der Solaris Man-Page:

BEZEICHNUNG

Das script Das Dienstprogramm wird von allem aufgezeichnet, was auf Ihrem Bildschirm gedruckt ist. Der Datensatz ist an geschrieben zu Dateiname. Wenn kein Dateiname angegeben ist, wird der Datensatz in der Datei gespeichert Typoskript...

Der Skriptbefehl Forken und erstellt eine Unterschale gemäß dem Wert von $ Shell und zeichnet den Text aus dieser Sitzung auf. Das Skript endet, wenn die gegabelte Shell ausgeht oder wenn Steuer-D eingegeben wird.

Ich würde auch für die erwartete Antwort abstimmen. Ich musste etwas Ähnliches aus einer Gui'ish -Anwendung tun. Der Trick (wenn auch mühsam), sich die Kontrollfiguren zu umgehen, bestand darin, alle Verschiedenheiten aus den zurückgegebenen Saiten zu entziehen. Es hängt irgendwie davon ab, wie chaotisch der Bildschirmkratzer ist.

Hier ist meine Funktion aus diesem Skript als Beispiel:

# 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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top