Question

Je peux configurer une connexion Telnet dans Perl aucun problème, et je viens de découvrir des malédictions, et je me demande si je peux utiliser les deux pour gratter la sortie de la session Telnet.

Je peux afficher sur une ligne, une colonne le contenu de STDOUT en utilisant le script simple ci-dessous:

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

Et en utilisant ce qui est ci-dessous, je peux ouvrir une connexion Telnet et envoyer des commandes recevoir sans problème:

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

... Mais ce que j'aimerais vraiment faire, c'est obtenir la réponse Telnet (qui comprendra des caractères de contrôle du terminal), puis rechercher une ligne sur une ligne à l'aide de malédictions. Quelqu'un connaît-il un moyen de relier les deux ensemble? Il me semble que les malédictions ne peuvent fonctionner que sur stdout

Était-ce utile?

La solution

Vous cherchez Terme :: VT102, qui émule un terminal VT102 (convertissant les caractères de contrôle du terminal en un état d'écran virtuel). Il y a un exemple montrant comment l'utiliser avec Net :: telnet dans VT102 / Exemples / Telnet-usage.pl (Le répertoire des exemples se trouve dans le répertoire VT102 pour une raison quelconque).

Cela fait environ 7 ans que j'ai utilisé cela (le système que je automatisant est passé à une interface Web), mais cela fonctionnait.

Autres conseils

Les malédictions font le contraire. Il s'agit d'une bibliothèque C pour optimiser les mises à jour d'écran d'un programme rédigeant à un terminal, à l'origine conçu pour être utilisé sur une connexion en série lente. Il n'a pas la capacité de gratter une disposition à partir d'une séquence de caractères de contrôle.

Un meilleur pari serait un émulateur terminal qui a une API avec la capacité de faire ce type de grattage d'écran. Du haut de ma tête, je ne sais pas si des émulateurs terminaux open source le font, mais il y en a certainement des services commerciaux qui peuvent.

Tu veux probablement quelque chose comme Attendre

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 vous interagissez uniquement avec des commandes et des réponses en texte brut, vous pouvez utiliser Attendre Pour scripter cela, sinon, vous pouvez utiliser Terme :: VT102, qui vous permet d'écraser la rupture (lire des parties spécifiques de l'écran, envoyer du texte, gérer les événements sur le défilement, le mouvement du curseur, les modifications du contenu de l'écran et autres) en utilisant des séquences d'échappement VT102 pour le contrôle d'écran (par exemple, une application à l'aide de la bibliothèque de maudire) .

Ou vous pouvez utiliser le scénario commande pour cela.

De la page d'homme Solaris:

LA DESCRIPTION

La script L'utilitaire fait un enregistrement de tout ce qui est imprimé sur votre écran. Le dossier est écrit sur nom de fichier. Si aucun nom de fichier n'est donné, l'enregistrement est enregistré dans le fichier manuscrit...

La commande de script fournit et crée une sous-coque, selon la valeur de $ shell, et enregistre le texte de cette session. Le script se termine lorsque le shell fourchu sort ou lorsque le contrôle-D est tapé.

Je voterais également pour la réponse à attendre. J'ai dû faire quelque chose de similaire à partir d'une application Gui'ish. L'astuce (quoique fastidieuse) pour contourner les caractères de contrôle a été de dépouiller tous les personnages divers des cordes retournées. Cela dépend en quelque sorte de la façon dont la rupture de l'écran finit par être en désordre.

Voici ma fonction de ce script comme exemple:

# 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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top