Вопрос

Я могу настроить соединение Telnet в Perl без проблем, и только что обнаружил проклятия, и мне интересно, могу ли я использовать два вместе, чтобы соскрести вывод с сеанса Telnet.

Я могу просматривать в строке, в столбце содержимое stdout, используя простой сценарий ниже:

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

И с помощью ниже, я могу открыть соединение Telnet и отправить команды приема без проблем:

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

... но то, что я действительно хотел бы сделать, это получить ответ Telnet (который будет включать в себя символы управления терминалами), а затем поиск в строке столбца с использованием проклятий. Кто -нибудь знает, как я могу соединить их вместе? Мне кажется, что проклятия могут работать только на stdout

Это было полезно?

Решение

Ты ищешь Термин :: vt102, который эмулирует терминал VT102 (преобразование символов управления терминалами обратно в виртуальное состояние экрана). Есть пример, показывающий, как его использовать с Net :: telnet в VT102/Примеры/Telnet-usage.pl (Справочник примеров по какой -то причине находится внутри каталога VT102).

Прошло около 7 лет с тех пор, как я использовал это (система, которую я автоматизировал, переключилась на веб-интерфейс), но раньше она работала.

Другие советы

Проклятия делает наоборот. Это библиотека C для оптимизации обновлений экрана от программы, написанной на терминал, изначально разработанной для использования в течение медленного последовательного соединения. Он не имеет возможности соскрести макет из последовательности контрольных символов.

Лучшей ставкой будет эмулятор терминала, который имеет API с возможностью делать этот тип экрана. Вне макушки моей головы я не уверен, что какие-либо эмуляторы терминалов с открытым исходным кодом делают это, но есть, безусловно, есть коммерческие доступные, которые могут.

Вы, вероятно, хотите что -то вроде Ожидать

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

Если вы взаимодействуете исключительно с простыми текстовыми командами и ответами, вы можете использовать Ожидать Чтобы скрепить это, в противном случае вы можете использовать Термин :: vt102, который позволяет экране Scrape (прочитайте определенные части экрана, отправляйте текст, обрабатывайте события при прокрутке, движении курсора, изменениях экрана и других) с использованием последовательностей Escape VT102 для управления экраном (например, приложение с использованием библиотеки CRCSES) Анкет

Или вы можете использовать сценарий командовать для этого.

От Solaris Man-Page:

ОПИСАНИЕ

А script Утилита делает запись всего, что напечатано на вашем экране. Запись написана имя файла. Анкет Если имя файла не указано, запись сохраняется в файле машинопись...

Команда скрипта разбивает и создает суб-оболочку в соответствии с значением $ Shell, и записывает текст из этого сеанса. Сценарий заканчивается, когда раздвоенная оболочка выходит или при вводе управления D.

Я бы проголосовал также за ожидаемый ответ. Мне пришлось сделать что -то подобное из применения в графике. Хитрость (хотя и утомительно), чтобы обойти контрольные персонажи, заключалась в том, чтобы лишить всех символов разного из возвращенных струн. Это вроде зависит от того, насколько грязным экраном в конечном итоге.

Вот моя функция из этого сценария в качестве примера:

# 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];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top