Ключевые слова:perl, telnet, module, (найти похожие документы)
From: Denis Roshchin <denis@komkon.org.>
Newsgroups: http://www.komkon.org/~denis/
Date: Mon, 20 Dec 2004 18:21:07 +0000 (UTC)
Subject: Описание Perl модуля Net::Telnet
Оригинал: http://www.komkon.org:8008/~denis/mydoc/Net-Telnet.htm
NET-TELNET
(полное описание, примеры)
Denis Roshchin, denis@komkon.org & http://www.komkon.org/~denis/Назначение
Net::Telnet - модуль, для взаимодействия с TCP-портами (включая telnet).
Описание
Net::Telnet позволяет вам соединиться с TCP-портом и
считывать/посылать информацию (I/O), в основном используя TELNET
протокол. Простейшие I/O-методы, такие как print, get, и getline
также поддерживаются. Другие интерактивные функции также
поддерживаются так как соединение по телнет-порту означает соединение
с программой, спроектированной в расчете на общение с человеком. Эти
функции включают возможности установления тайм-аутов и ожидания
определенной строки, например приглашение командной строки.
Другие случаи, когда вы хотите использовать Net::Telnet:
1. Вы не знакомы с соккетами (sockets) и просто хотите, чтобы скрипт
подключался к TCP-сервису.
2. Вы хотите устанавливать ваши собственные тайм-ауты на соединение,
чтение или запись.
3. Ваша программа общается с интерактивной программой на другом конце
соккета и вы хотите дождаться какой-либо строки.
Ниже приведен пример, который печатает список людей на хосте
("/usr/bin/who").
В дополнение к имени пользователя и пароля вы также должны знать
приглашение командной строки, которая например будет bash$.
use Net::Telnet ();
$t = new Net::Telnet (Timeout => 10,
Prompt => '/bash\$ $/');
$t->open("sparky");
$t->login($username, $passwd);
@lines = $t->cmd("/usr/bin/who");
print @lines;
Больше примеров можно найти в секции ПРИМЕРЫ.
Вопросы по использованию можно обсуждать в этих USENET- конференциях:
comp.lang.perl.modules
de.comp.lang.misc
fido7.ru.perl
Что необходимо знать перед началом использования
Весь ввод - буферизован, вывод - нет. Каждый объект имеет свой
собственный буфер.
Разделитель на выводе у print() и cmd() установлен на "\n", так что
нет нужды добавлять к каждой команде символ новой строки. Смотрите
output_record_separator() чтобы изменить такое поведение.
Методы login() и cmd() используют настройки prompt-а (приглашение
командной строки) чтобы определить когда вход в систему или удаленная
команда выполнена. Метод вылетит по тайм-ауту если вы установили не
правильное значение.
Используйте комбинацию из print() и waitfor() как альтернативу
функциям login() и cmd() когда они не делают желаемого.
Ошибки, такие как вылет по тайм-ауту обрабатываются согласно с
errmode. Действие по умолчанию - вывод сообщения и выход из программы.
Смотрите errmode() для большей информации.
Чтобы избежать неправильной интерпретации обратного слэша, всегда
используйте одинарную кавычку вместо двойной для prompt() и waitfor()
(например, 'bash\$ $/'). Если вы используете DOS-пути, необходимо
использовать обратные слэши (например,
'/c:\\\\users\\\\billE<gt>$/I>').
Конечно не забывайте о символах типа ., [, или $. Для них необходим
всего лишь один обратный слэш. Символы ^ и $ указывают на позицию в
буфере.
На вводе, каждый <<возврат каретки>> и <<новая линия>> (например,
"\015\012" или CR LF) конвертируется в "\n". На выводе, каждый "\n"
конвертируется в последовательность CR LF. TCP-протоколы обычно
используют ASCII-последовательность, чтобы определить <<возврат
каретки>> или <<новая линия>>.
Тайм-ауты на время соединения отключены для машин, которые не
поддерживают функцию alarm(). Чаще всего это машины Win-32.
Более универсальная поддержка тайм-аутов на процесс соединения будет
написан в следующих версиях.
Необходимо использовать, как минимум Perl версии 5.002 или выше. Этот
модуль не нуждается в каких-либо дополнительных библиотеках, которые
не идут вместе со стандартным дистрибутивом Perl. on.
Если у вас установлена библиотека IO::libraries (она идет в
стандартной комплектации, начиная с версии 5.004 и выше), то
IO::Socket::INET используется как базовый класс. В противном случае
используется FileHandle.
Отладка (Debugging)
Наиболее типичная ошибка - вылет по тайм-ауту из-за неверного
предположения что будет послано удаленной стороной по отношению к тому
что действительно послано. Наиболее простой способ сравнить ваши
предположения и то, что удаленный сервер вам действительно посылает -
использовать input_log() и dump_log().
dump_log() позволяет видеть данные, переданные перед тем как любой
перевод выполнен. input_log() показывает данные, после перевода.
(Включая конвертирование символа конца строки а так же ответа на
команды telnet-протокола)
Существует два стиля, которыми можно воспользоваться:
Net::Telnet->new(Timeout => 20);
или
Net::Telnet->new(-timeout => 20);
Соединение с удаленной Win32-машиной
По умолчанию Windows не идет с telnet-сервисом, однако в любом случае
есть возможность использовать программные продукты от третьих фирм,
которые позволяют производить подключение к DOS-shell'у.
Методы
Ниже, скобками [] обозначаются необязательные параметры.
new - создание нового объекта Net::Telnet
$obj = Net::Telnet->new([Binmode => $mode,]
[Cmd_remove_mode => $mode,]
[Dump_Log => $filename,]
[Errmode => $errmode,]
[Fhopen => $filehandle,]
[Host => $host,]
[Input_log => $file,]
[Input_record_separator => $char,]
[Option_log => $file,]
[Output_log => $file,]
[Output_record_separator => $char,]
[Port => $port,]
[Prompt => $matchop,]
[Telnetmode => $mode,]
[Timeout => $secs,]);
Это - конструктор для Net::Telnet объектов. Новый объект возвращается
в случае удачи, или исполняется errmode - в случае не удачи. Смотрите
errmode() для большей информации. Аргумент является ярлыком(short-cut)
к методу такого-же имени.
Если аргумент $host дан - объект открывается при соединении к TCP
$port на $host. Также смотрите open(). Новому объекту присваиваются
следующие значения по умолчанию, если аргументы не заданы:
* Host => "localhost"
* Port => 23
* Prompt => '/[\$%#E<gt>] $/'
* Timeout => 10
* Errmode => "die"
* Output_record_separator => "\n"
* Input_record_separator> => "\n"
* Binmode => 0 (что значит делать перевод новой строки)
* Cmd_remove_mode => "auto"
<binmode> - определяет перевод новой строки
$mode = $obj->binmode;
$prev = $obj->binmode($mode);
Этот метод определяет, что перевод конца строки и возврата каретки -
переводятся (CR LF или "\015\012"). По умолчанию - они переводятся (то
есть binmode - 0).
Если аргументы не заданы, возвращается текущая мода.
Если $mode - еденица (1), то binmode - включена и перевод новой строки
не производится.
Если $mode - ноль (0), то binmode - выключена и перевод новой строки
производится. Во вводе каждое CR LF конвертируется в "\n". В выводе -
"\n" конвертируется в CR LF.
Учтите, что ввод всегда буферизован. Изменение binmode не влияет на
то, что уже было прочитано в буфер. Вывод не буферизован и изменение
binmode вступит в силу мгновенно.
* break - посылка символа break
$ok = $obj->break;
Этот метод посылает символ break. Этот символ предоставлен так как его
сигналу за USASCII во многих системах дано локальное значение.
* buffer - скалярное значение к буферу ввода объекта
$ref = $obj->buffer;
Этот метод возвращает скалярное значение к буферу ввода для $obj.
Данные в буфере - данные, которые были прочтены с удаленной машины но
небыли еще считаны пользователем. Модификации к буферу ввода
возвращаются при последующем чтении.
* Buffer_empty - сброс всех данных в буфере ввода объекта
$obj->buffer_empty;
Этот метод удаляет все данные в буфере ввода для $obj.
* close - закрыть объект
$ok = $obj->close;
Этот метод закрывает сокет, фаил, или поток(pipe) ассоциированные с
объектом.
* cmd - посылает команду и принимает вывод
$ok = $obj->cmd($string);
$ok = $obj->cmd(String => $string,
[Output => $ref,]
[Prompt => $match,]
[Timeout => $secs,]
[Cmd_remove_mode => $mode,]);
@output = $obj->cmd($string);
@output = $obj->cmd(String => $string,
[Output => $ref,]
[Prompt => $match,]
[Timeout => $secs,]
[Cmd_remove_mode => $mode,]);
Этот метод посылает команду $string, и читает посланные назад символы,
пока не достигнут заданный вид командной строки. Это подразумевает,
что программа, которой вы посылаете команду - какой-либо вид
командного интерпретатора (shell).
В скалярном контексте прочитанные символы сброшены и возвращено
значение boolean, показывающее успех или не успех посыла командной
стоки и чтения. Учтите, что для получения ошибки errmode() должна быть
установлена на значение die.
Многие командные интерпретаторы возвращают команду назад. В
большенстве ситуаций, этот метод удаляет первую линию возвращенную с
сервера (например этаже команда, пришедшая назад). Смотрите
cmd_remove_mode() для большего контроля.
Испрользуйте dump_log() для отладки, когда этот метод вылетает по
тайм-ауту и вы не думаете, что он должен
Предпочтите использование комбинации print() и waitfor() как
альтернативный метод, когда не происходит того, что вы хотите.
Аргументы названные Output предлагают альтернативный метод приема
вывода команд.
* cmd_remove_mode - управление над echoed командами
$mode = $obj->cmd_remove_mode;
$prev = $obj->cmd_remove_mode($mode);
Этот метод контролирует как скрипт будет работать с echoed командами
на выводе, возвращенные от cmd(). Обычно, когда вы посылаете команду
на удаленный сервер, первая возвращенная линия - echoed команда.
Используйте эту моду для удаления первой линии из вывода нормально
возвращенного из cmd().
Если никакие аргументы не заданы, возвращается текущая мода.
Если $mode - 0, то из команды вывода, возвращенной с cmd() не
удаляются линии. Если $mode - имеет положительное значение integer,
тогда первая строка удаляется.
По умолчанию, $mode установлен в положение "auto".
* dump_log - создает лог I/O в формате dump
$fh = $obj->dump_log;
$fh = $obj->dump_log($fh);
$fh = $obj->dump_log($filename);
Этот метод стартует или останавливает ведение лога ввода/вывода
объекта. Формат dump показывает блоки чтения и записи в
шестнадцатеричном и в обычном печатном формате. Этот метод полезен при
отладке. Вы также можете сначала попробовать input_log() так как он
является более читаемым.
Если аргумент не задан, текущий log filehandle (ссылка на лог-фаил)
возвращается. Нулевая строка означает, что ведение лога выключено.
Чтобы выключить ведение лога, используйте нулевую строку как аргумент.
Если дается ссылка на открытый файл, он используется для ведения лога.
В другом случае аргумент был бы именем файла.
* eof - индикатор конца файла
$eof = $obj->eof;
Этот метод показывает если был прочитан конец файла. Так как ввод
буферизован это не тоже самое, что закрытие $obj. Другими словами,
$obj может быть закрыт, но все еще может содержать что-то в буфере. В
этом случае вы можете считывать, но не можете записывать.
* errmode - определяет действие, предпринимаемое в случае ошибки
$mode = $obj->errmode;
$prev = $obj->errmode($mode);
Метод получает или устанавливает действие, используемое когда
происходит ошибка использования объекта. Первый вызов возвращает
текущую моду. Второй - устанавливает значение $mode и возвращает
предыдущую моду. Правильные значения для $mode - die (по умолчанию),
return, coderef, или arrayref.
Когда мода установлена die и происходит ошибка, на печатается ошибка и
программа завершается
Если мода установлена coderef, то когда происходит ошибка вызывается
coderef c ошибкой, как первый аргумент. Используя эту моду вы можете
создавать вашу собственную обработку ошибок. Если coderef возвращает
сам себя, то метод сгенерировавший ошибку возвращает неопределенное
значение или нулевой лист(массив) в зависимости от контекста.
Если мода установлена arrayref, то первый элемент массива(array)
должен быть coderef. Любой следующий элемент - аргумент к coderef.
Когда достигнута ошибка, вызывается coderef его аргументами. Используя
эту моду вы можете создавать вашу собственную обработку ошибок. Если
coderef возвращает сам себя, то метод сгенерировавший ошибку
возвращает неопределенное значение или нулевой лист(массив) в
зависимости от контекста.
* errmsg - наиболее частые сообщения об ошибках
$msg = $obj->errmsg;
$prev = $obj->errmsg(@msgs);
Первый вызов возвращает сообщение ошибки ассоциированное с объектом.
Нулевая строка возвращается, если ошибки не было. Второй вызов ставит
сообщение об ошибке для объекта содержащегося в @msgs и возвращает
предыдущее сообщение об ошибке. Обычно, сообщение об ошибке
устанавливается внутри метода, когда достигнута ошибка.
* error - преобразует моду дейтвие при ошибке
$obj->error(@msgs);
Этот метод превращает @msgs в строку и помещает её в объект как
сообщение об ошибке. Также смотрите errmsg() и errmode().
Этот метод, обычно, используется этим классом или суб-классом чтобы
преобразовать действие пользователя, когда возвращается ошибка.
* fhopen - используется для уже открытых ссылок на файлы для
ввода/вывода
$ok = $obj->fhopen($fh);
Этот метод ассоциирует открытую ссылку на файл $fh для ввода/вывода.
Ссылка в файл $fh должен быть уже открыть.
Вы можете использовать эту возможность для ввода/вывода на что-то
отличное от TCP-порта, например - STDIN или файл. Вместо открытия
объекта для Ввода/Вывода для TCP-порт через open() или new(),
используйте этот метод.
* get - прочесть блок информации
$data = $obj->get([Timeout => $secs,]);
Этот метод считывает блок данных из объекта и возвращает его вместе с
любой другой буферизованой информацией. Если ничего не буферизовано -
get будет ждать информации пока не наступит тайм-аут описанный в
объекте. Вы можете перекрыть тот тайм-аут используя $secs. Также
смотрите timeout(). Если буферизованые данные доступны, также
проверяется блок данных, который может быть прочитан немедленно.
На eof возвращается неопределенное значение. На тайм-аут или другие
ошибки - исполняется мода ошибок.
Неопределенное значение возвращается для eof и тайм-аута также, когда
errmode не установлено как die. Используйте eof() и timed_out() для
различения их.
* getline - прочесть следующую строку
$line = $obj->getline([Timeout => $secs,]);
Этот метод читает и возвращает следующую строку данных из объекта. Вы
можете использовать input_record_separator() чтобы изменить
разделитель линий. По умолчанию - это "\n".
Если линия не доступна немедленно, этот метод блокирует ожидание линии
или тайм-аут. Вы можете переписать тайм-аут объекта для этого метода
используя $secs. Также смотрите timeout().
На eof возвращается неопределенное значение. На тайм-аут или другие
ошибки - исполняется мода ошибок.
Неопределенное значение возвращается для eof и тайм-аута также, когда
errmode не установлено как die. Используйте eof() и timed_out() для
различения их.
* getlines - читает следующие линии
@lines = $obj->getlines([Timeout => $secs,]);
Этот метод читает и возвращает следующие доступные линии данных из
объекта. Вы можете использовать input_record_separator() чтобы
изменить разделитель линий. По умолчанию - это "\n".
Если линия не доступна немедленно, этот метод блокирует ожидание линии
или тайм-аут. Вы можете переписать тайм-аут объекта для этого метода
используя $secs. Также смотрите timeout().
На eof возвращается нулевой массив (array). На тайм-аут или другие
ошибки - исполняется мода ошибок.
Нулевой массив(array) возвращается для eof и тайм-аута также, когда
errmode не установлено как die. Используйте eof() и timed_out() для
различения их.
* host - имя удаленного хоста
$host = $obj->host;
$prev = $obj->host($host);
Этот метод определяет удаленный хост. Без аргументов данный метод
возвращает текущее имя удаленного хоста установленное в объекте. С
аргументами - устанавливается текущий хост - $host и возвращается
предыдущее имя хоста. Вы можете указывать имя хост используя само имя
или же IP-адрес.
* input_log - ведение лога всего ввода
$fh = $obj->input_log;
$fh = $obj->input_log($fh);
$fh = $obj->input_log($filename);
Этот метод начинает или заканчивает ведение лога ввода. Это очень
полезно при отладке. Смотрите также dump_log(). Так как большинство
командных интерпретаторов возвращают команду назад, вы будите иметь
весь ваш вывод в этом логе также.
Если никаких аргументов не задано - возвращается ссылка на файл лога.
Нулевая строка показывает что ведение лога выключено.
Чтобы отключить ведение лога используйте нулевую строку как аргумент.
Если ссылка на открытый файл дана, она используется для ведение лога и
возвращается. В другом случае аргумент подразумевает быть именем
файла, файл открыт для лога и ссылка на файл возвращается.
* input_record_separator - разделитель строки ввода
$rs = $obj->input_record_separator;
$prev = $obj->input_record_separator($rs);
Этот метод определяет разделитель строки для ввода. Используется с
getline(), getlines() и cmd() чтобы определить строки во вводе.
Без аргументов этот метод возвращает текущий разделитель установленный
в объекте. С аргументом - устанавливает разделитель $rs и возвращает
предыдущее значение.
* lastline - чтение последней строки
$line = $obj->lastline;
$prev = $obj->lastline($line);
Этот метод сохраняет последнюю строку из объекта. Это может быть
полезным сообщением ошибки когда удаленная сторона неожиданно
закрывает соединение. Обычно, удаленная машина напечатает сообщение с
ошибкой перед закрытием сессии.
Без аргументов метод возвращает последнюю линию прочитанную из
объекта. С аргументов - устанавливается чтение последний строки на
$line и возвращается предыдущее значение. Обычно, только внутренние
методы устанавливают последнюю линию.
* login - стандартный вход в систему
$ok = $obj->login($username, $password);
$ok = $obj->login(Name => $username,
Password => $password,
[Prompt => $match,]
[Timeout => $secs,]);
Этот метод позволяет провести стандартный вход в систему ожидая
приглашения и посылая $username, потом ожидая приглашения и посылая
$password, и ожидая приглашения командной строки. Если удаленная
машина посылает что-то, что не совпадает с ожидаемым, то данный метод
вылетит по тайм-ауту (если он конечно не отключен).
Приглашение ввести имя пользователя должно совпадать с этим образцом
(не чувствительным к заглавным/не заглавным буквам):
/login[: ]*$/i
/username[: ]*$/I
Приглашение ввести пароль:
/password[: ]*$/I
Приглашение ввода команды интерпретатора должно совпадать с
настройками командной строки.
Используйте dump_log() для отладки когда метод продолжает вылетать по
тайм-ауту, а вы думаете, что он не должен.
Предпочитайте использование комбинации print() и waitfor() как
альтернативу этому методу, когда он не делает того, что вы хотели-бы
(например, удаленная машина не посылает приглашение ввода имени
пользователя).
Опциональны аргументы также поддерживаются для замены текущих настроек
приглашения командной строки и тайм-аута.
* max_buffer_length - максимальный размер буфера ввода
$len = $obj->max_buffer_length;
$prev = $obj->max_buffer_length($len);
Этот метод определяет максимальный размер буфера ввода. Ошибка
генерируется когда происходит попытка прочесть в буфер свыше лимита.
Значение по умолчанию - 1,048,576 bytes (1MB). Буфер ввода может
вырасти намного больше блока, когда вы продолжительно читаете
используя getline() или waitfor() и данные не содержат символов новой
строки или совпадают с waitfor.
Без аргументов данный метод возвращает текущую максимальную буферную
длине установленную для объекта. С аргументом - устанавливается
максимальная длина буфера равная $len и возвращается предыдущее
значение.
* open - соединение с портом на удаленном хосте
$ok = $obj->open($host);
$ok = $obj->open([Host => $host,]
[Port => $port,]
[Timeout => $secs,]);
Этот метод открывает TCP-соединение с $port на $host. Если любой из
аргументов отсутствует - используется текущее значение host() или
port(). Также опциональные аргументы позволяют заменить текущие
настройки связанные с тайм-аутом.
На вылет по тайм-ауту или другие ошибки соединения, производится
действие моды ошибки.
Тайм-ауты не работают для этого метода на машинах, которые не
поддерживают SIGALRM - в большинстве случаев это Win32 машины. Для
этих машин, ошибка возвращается когда система достигает своего
собственного тайм-аута при попытках соединиться.
Побочный эффект этого метода - обнуление интервала SIGALRM.
* option_accept - indicate willingness to accept a TELNET option
$fh = $obj->option_accept([Do => $telopt,]
[Dont => $telopt,]
[Will => $telopt,]
[Wont => $telopt,]);
Этот метод используется для определения когда удаленная машина
предложит активировать TELNET-опцию. Если вы используете Do или Will
для определения готовности активации, то функция option_callback().
Должна быть определена. Смотрите option_callback() для деталей.
Вы можете посылать множество Do, Don't, Will или Wont аргументов для
различных TELNET-опций.
Нижеследующий пример описывает понимание названых аргументов. Ниже
используются такие Telnet-опции, как TELOPT_ECHO (integer константа).
Смотрите также Telnet.pm для полного листа
The following example describes the meaning of the named arguments. A
TELNET option, such as C<TELOPT_ECHO> used below, is an integer
constant that you can import from Net::Telnet. See the source in file
Telnet.pm for the complete list.
Do => TELOPT_ECHO
мы примем предложение активировать echo-опцию на локальной машине
Dont => TELOPT_ECHO
мы не примем предложение активировать echo-опцию на локальной машине
Will => TELOPT_ECHO
мы примем предложение активировать echo-опцию на удаленной машине
Wont => TELOPT_ECHO
мы не примем предложение активировать echo-опцию на удаленной машине
Используйте option_send() чтобы послать запрос на удаленную машину
чтобы активировать или деактивировать определенную Telnet-опцию.
* option_callback - определяет опцию переговоров callback
$coderef = $obj->option_callback;
$prev = $obj->option_callback($coderef);
Этот метод определяет callback рутину, которая вызывается когда
Telnet-опция активирована или деактивирована. Однажды определенная,
option_callback, уже не может иметь неопределенное значение. Вызов
этого метода с другим $coderef - меняет его.
Условия которые вызывает $coderef:
* Опция активируется так как удаленная машина запросила активации и
была использована option_accept() чтобы устроить её принятие.
* Удаленная машина решает деактивировать опцию, которая в настоящее
время активирована. Учтите, что Net::Telnet всегда принимает
запрос на деактивацию с удаленной машины.
* option_send() была использована чтобы послать запрос на активацию
или деактивацию опции и ответ с удаленной машины был только
принят. Учтите, что если запрос на активацию отвергнут, то
$coderef вызывается, даже если опция не изменяется.
Аргументы, передающиеся $coderef:
&$coderef($obj, $option, $is_remote,
$is_enabled, $was_enabled, $buf_position);
1. $obj является объектом Net::Telnet.
2. $option является Telnet-опцией.
3. $is_remote является переменной типа boolean, показывающей для
какой машины (удаленной или локальной) опция принимается.
4. $is_enabled является переменной типа boolean, показывающей
активирована ли опция или нет.
5. $was_enabled является переменной типа boolean, показывающей была
ли опция ранее активирована или нет
6. $buf_position является числовой переменной(integer) показывающий
позицию в буфере где опция работает. Смотрите buffer() для доступа к
буферу ввода объекта.
* option_log - ведение лога всех TELNET-опций посланных или принятых
$fh = $obj->option_log;
$fh = $obj->option_log($fh);
$fh = $obj->option_log($filename);
Этот метод включает или выключает ведение лога всех TELNET-опций
посланных или принятых. Это очень полезно при отладке, при посылке
опций через option_send() или при приеме опций с удаленной стороны
посредствам option_accept(). Также смотрите dump_log().
Если никаких аргументов не задано, возвращается ссылка на файл лога.
Нулевая строка означает, что ведение лога выключено.
Чтобы остановить ведение лога, используйте пустую строку как аргумент.
Если дана ссылка на открытый файл, то он используется для ведения
лога и возвращается. В другом случае, аргумент подразумевает быть
именем файла, файл - открыт для ведения лога и ссылка на файл
возвращается.
* option_send - send TELNET option negotiation request
$ok = $obj->option_send([Do => $telopt,]
[Dont => $telopt,]
[Will => $telopt,]
[Wont => $telopt,]
[Async => $boolean,]);
Эта функция еще не инвентаризована. Ждите следующих версий.
* option_state - получить текущее положение Telnet-опции
$hashref = $obj->option_state($telopt);
Этот метод возвращает hashref содержащий копию текущего положение
Telnet-опции $telopt.
Здесь перечислены значение возвращаемые в хэше(hash):
$hashref->{remote_enabled}
boolean которая показывает если опция активирована на удаленной
машине.
$hashref->{remote_enable_ok}
boolean которая показывает если активировать эту опцию на удаленной
машине приемлимо.
$hashref->{remote_state}
string используемый для удержания внутреннего положения опции
переговоров для этой опции на удаленной машине.
$hashref->{local_enabled}
boolean которая показывает если опция активирована на локальной
машине.
$hashref->{local_enable_ok}
boolean которая показывает если активировать эту опцию на локальной
машине приемлимо.
* output_field_separator - разделитель полей для печати
$ofs = $obj->output_field_separator;
$prev = $obj->output_field_separator($ofs);
Этот метод определяет разделитель полей для print(). Обыкновенно,
метод просто использует запятую как разделитель. Установите это
значение чтобы указать что должно печататься между полями.
Без аргументов этот метод возвращает текущий разделитель полей вывода
установленный в объекте. С аргументами, - устанавливается разделитель
$ofs и возвращается предыдущее значение.
* output_log - ведение лога всего вывода
$fh = $obj->output_log;
$fh = $obj->output_log($fh);
$fh = $obj->output_log($filename);
Этот метод включает или выключает ведение лога на вывод. Это очень
полезно при отладке. Также смотрите dump_log(). Так как большинство
командных интерпретаторов возвращают назад принятую команду, вывод
будет также в логе ввода. Смотрите также input_log(). Учтите что
ведение лога вывода происходит перед переводом символа новой строки.
Смотрите binmode() для больших деталей о трансляции символа новой
строки.
Если аргументы не задаются, возвращается ссылка на файл ведение лога.
Нулевая строка означает, что ведение лога выключено.
Чтобы остановить ведение лога, задайте пустую строку как аргумент.
Если дана открытая ссылка на файл, она используется для ведения лога и
возвращается. В другом случае, аргумент подразумевает быть именем
файла, файл открывается для ведения лога и ссылка на этот файл
возвращается.
* output_record_separator - разделитель линий вывода
$ors = $obj->output_record_separator;
$prev = $obj->output_record_separator($ors);
Этот метод определяет разделитель записей вывода для print().
Обыкновенно, при выводе на печать используется запятая.
Учтите: вывод записей установлено по умолчанию на "\n", так что нет
нужды добавлять к каждой вашей команде символ новой строки.
Без аргументов этот метод возвращает текущее значение. С аргументом -
устанавливается разделитель вывода на $ors и возвращается предыдущее
значение.
* port - удаленный порт
$port = $obj->port;
$prev = $obj->port($port);
Этот метод определяет удаленный TCP-порт. Без аргументов этот метод
возвращает текущий номер порта. С аргументом устанавливает текущее
значение $port и возвращает предыдущий порт. Если $port имя сервиса,
тогда сначала оно конвертируется в номер порта (используя функцию
перла getsetvbyname()).
* print - печать в объект
$ok = $obj->print(@list);
Этот метод печатает строку или лист из строк, разделенный запятаями, в
открытый объект и возвращает не ноль если все данные были успешно
записаны.
По умолчанию output_record_separator() установлен со значением "\n"
чтобы ваша команда автоматически кончалась символом новой строки. В
большинстве случаев ваш вывод будет прочитан командным
интерпретатором, который не примет команду, пока не будет послан
символ новой строки. Это аналогично, как кто-то пишет команду и
нажимает ВВОД.
В случае неудачи, возможно что какие-то данные таки были напечатаны.
Если все вылетело по тайм-ауту печати, используйте print_length()
чтобы определить как много данных было записано перед вылетом по
тайм-аутом.
* print_length - число байт записанное print
$num = $obj->print_length;
Возвращает количество байт, успешно напечатанных последним print().
* prompt - шаблон приглашение командной строки
$matchop = $obj->prompt;
$prev = $obj->prompt($matchop);
Этот метод устанавливает шаблон для нахождение приглашения на ввод.
Это должна быть строка, записанная в правильном формате перла. Методы
login() и cmd() читают, пока не найдут это приглашение. Они
завершаются неудачно по тайм-ауту если шаблон, заданный вами, не
совпадал с тем, что было послано удаленной машиной.
Без аргументов, этот метод возвращает текущее значение, установленное
в объекте. С аргументами - устанавливается новое значение $matchop и
возвращается предыдущее.
Значение, заданное по умолчанию, - '/[\$%#E<gt>] $/'
Всегда используйте одинарные кавычки, вместо двойных (например,
'/bash\$ $/'). Если вы хотите задать путь в стиле DOS, используйте
четыре обратных слэша чтобы представить один (например,
'/c:\\\\users\\\\billE<gt>$/i').
Конечно, не забывайте о символах ., [, $. Для них необходим всего один
обратный слэш. Символы ^ и $ указывают на позицию в буфере ввода.
* telnetmode - включает/выключает интерпретацию telnet-команд
$mode = $obj->telnetmode;
$prev = $obj->telnetmode($mode);
Этот метод контролирует чтобы Telnet-команды были распознаны или нет.
Telnet-протокол использует некоторые символьные комбинации для
контроля сессии. Если порт, к которому вы соединяетесь использует не
Telnet-протокол, тогда вы должны выключить эту моду. По умолчанию она
включена.
При вызове без аргументов, возвращается текущая мода.
$mode имеет следующие значения: 0 - Telnet-мода выключена; 1 -
включена.
* timed_out - индикатор тайм-аута
$boolean = $obj->timed_out;
$prev = $obj->timed_out($boolean);
Этот метод показывает если предыдущее чтение или запись вылетели по
тайм-ауту.
Без аргументов метод возвращает true если предыдущий метод вылетел по
тайм-ауту. С аргументом - устанавливается индикатор. Обычно, только
внутренние методы устанавливают этот индикатор..
* timeout - тайм-аут интервал для ввода/вывода
$secs = $obj->timeout;
$prev = $obj->timeout($secs);
Этот метод устанавливает тайм-аут интервал который используется во
время присоединения к порту или когда исполняется ввод/вывод. Если
метод не закончен в этом интервале, то это ошибка и вызывается мода
ошибки.
Тайм-аут может быть абсолютным значением. Если $secs больше или равна
времени, когда программа была начата (как определено в $^T), то это
абсолютное время когда произойдет тайм-аут. Также смотрите функцию
time() перла. Родственный тайм-аут $secs случается когда начинается
метод вводы/вывода.
Если $secs равняется нулю, то тайм-аут случается если данные не могут
быть немедленно считаны или записаны. Используйте неопределенное
значение, чтобы выключить тайм-аут.
Без аргументов этот метод возвращает значение тайм-аута установленное
в объекте. С аргументом - устанавливается значение тайм-аута $secs и
возвращается предыдущее значение.
* waitfor - ожидания шаблона в вводе.
$ok = $obj->waitfor($matchop);
$ok = $obj->waitfor([Match => $matchop,]
[String => $string,]
[Timeout => $secs,]);
($prematch, $match) = $obj->waitfor($matchop);
($prematch, $match) = $obj->waitfor([Match => $matchop,]
[String => $string,]
[Timeout => $secs,]);
Этот метод читает, пока не будет найден шаблон совпадающий со строкой
во вводе. Все символы перед и включая найденное - исключаются из
потока ввода. В случае тайм-аута, конца файла (eof), или других ошибок
происходит мода ошибок.
В контексте массива, символы перед найденным и найденные символы
возвращаются в $prematch и $match.
Вы можете указать более чем один шаблон или строку просто посылая
много аргументов Match и/или String. $matchop должна быть правильным
perl-шаблоном. $string - является просто подстрокой для поиска в
потоке ввода.
Используйте dump_log() для отладки, когда этот метод продолжает
вылетать по тайм-ауту, а вы не думаете, что должен.
Используйте опциональные аргументы чтобы изменить текущие значение на
тайм-аут.
Чтобы избежать неожиданных обратных слэшей, всегда используйте
одинарные кавычки, заместо двойных, для создания аргументов для
prompt() и waitfor() (например, '/bash\$ $/'). Если вы создаете
файловый путь в стиле DOS, используйте четыре обратных слэша чтобы
представить один (например, '/c:\\\\users\\\\billE<gt>$/i').
Конечно, не забывайте о символах ., [, $. Для них необходим всего один
обратный слэш. Символы ^ и $ указывают на позицию в буфере ввода.
Смотрите также
RFC 854 (TELNET Protocol Specification)
ftp://ftp.isi.edu/in-notes/rfc854.txt
RFC 1143 (Method of Implementing TELNET Option Negotiation)
ftp://ftp.isi.edu/in-notes/rfc1143.txt
TELNET Option Assignments
ftp://ftp.isi.edu/in-notes/iana/assignments/telnet-optionsПримеры
Этот пример получает текущий прогноз погоды для города Brainerd (штат
Minnesota, США).
my ($forecast, $t);
use Net::Telnet ();
$t = new Net::Telnet;
$t->open("rainmaker.wunderground.com");
## Wait for first prompt and "hit return".
$t->waitfor('/continue:.*$/');
$t->print("");
## Wait for second prompt and respond with city code.
$t->waitfor('/city code.*$/');
$t->print("BRD");
## Read and print the first page of forecast.
($forecast) = $t->waitfor('/[ \t]+press return to continue/i');
print $forecast;
exit;
Этот пример проверяет POP-сервер чтобы увидеть если у вас есть новая
почта.
my ($hostname, $line, $passwd, $pop, $username);
$hostname = "your_destination_host_here";
$username = "your_username_here";
$passwd = "your_password_here";
use Net::Telnet ();
$pop = new Net::Telnet (Telnetmode => 0);
$pop->open(Host => $hostname,
Port => 110);
## Read connection message.
$line = $pop->getline;
die $line unless $line =~ /^\+OK/;
## Посылаем имя пользователя.
$pop->print("user $username");
$line = $pop->getline;
die $line unless $line =~ /^\+OK/;
## Посылаем пароль.
$pop->print("pass $passwd");
$line = $pop->getline;
die $line unless $line =~ /^\+OK/;
## Запрашиваем статус сообщений.
$pop->print("list");
$line = $pop->getline;
print $line;
exit;
Вот пример, который вы можете использовать, чтобы скачать файл любого
типа. Фаил читается с удаленной машины через стандартный вывод
(используя cat). Чтобы предотвратить любую обработку вывода, удаленный
стандартный вывод хоста переключен в raw-моду используя Bourne Shell.
Bourne Shell используется потому, что некоторые shell'ы, например
tcsh, предотвращают изменение tty-моды. До завершения, статистика в
стиле FTP печатается на stderr.
my ($block, $filename, $host, $hostname, $k_per_sec, $line,
$num_read, $passwd, $prevblock, $prompt, $size, $size_bsd,
$size_sysv, $start_time, $total_time, $username);
$hostname = "your_destination_host_here";
$username = "your_username_here";
$passwd = "your_password_here";
$filename = "your_download_file_here";
## Соединение и вход.
use Net::Telnet ();
$host = new Net::Telnet (Timeout => 30,
Prompt => '/[%#>] $/');
$host->open($hostname);
$host->login($username, $passwd);
## Будем уверены, что интерпретатор не найдет ничего в посланных данных.
$prompt = '_funkyPrompt_';
$host->prompt("/$prompt\$/");
$host->cmd("set prompt = '$prompt'");
## Получим размер файла.
($line) = $host->cmd("/bin/ls -l $filename");
($size_bsd, $size_sysv) = (split ' ', $line)[3,4];
if ($size_sysv =~ /^\d+$/) {
$size = $size_sysv;
}
elsif ($size_bsd =~ /^\d+$/) {
$size = $size_bsd;
}
else {
die "$filename: no such file on $hostname";
}
## Начнем посылку файла.
binmode STDOUT;
$host->binmode(1);
$host->print("/bin/sh -c 'stty raw; cat $filename'");
$host->getline; # discard echoed back line
## Прочитаем блок файла.
$num_read = 0;
$prevblock = '';
$start_time = time;
while (($block = $host->get) and ($block !~ /$prompt$/o)) {
if (length $block >= length $prompt) {
print $prevblock;
$num_read += length $prevblock;
$prevblock = $block;
}
else {
$prevblock .= $block;
}
}
$host->close;
## Напечатаем последний блок без промта.
$prevblock .= $block;
$prevblock =~ s/$prompt$//;
print $prevblock;
$num_read += length $prevblock;
die "error: expected size $size, received size $num_read\n"
unless $num_read == $size;
## Печатаем всё.
$total_time = (time - $start_time) || 1;
$k_per_sec = ($size / 1024) / $total_time;
$k_per_sec = sprintf "%3.1f", $k_per_sec;
warn("$num_read bytes received in $total_time seconds ",
"($k_per_sec Kbytes/s)\n");
exit;
Авторы
Автор статьи: Denis Roshchin <denis@komkon.org.>
Автор модуля: Jay Rogers <jay@rgrs.com.>
В этой статье были использованы материалы взятые из стандартной
документации, идущей вместе с модулем Net::Telnet.
Свяжитесь с Джеем Роджерсом (Jay Rogers) <jay@rgrs.com.> если у вас
есть какие-то соображения, исправления или если найдена ошибка.
Лицензионное соглашение
Статья: Может распространяться свободно с сохранением всех авторских
прав и ссыллок.
Модуль: Этот модуль является бесплатным. Вы можите распространять
и/или изменять его с теми же условиями, что и сам Perl.
Подскажите ктонить плиз!
Есть такой код:
#!/usr/bin/perl
use Net::Telnet ();
$t = new Net::Telnet;
$t->open("10.0.0.1");
$t->waitfor('/PASSWORD>.*$/');
$t->print("123");
$t->print("logout");
$t->close;
exit;
при этом ругается вот так
pattern match read eof at ac.pl line 6