Как я могу скринировать вывод от Telnet в Perl?
Вопрос
Я могу настроить соединение 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];
}