28.02.2019

PHP Telnet

Иногда возникает необходимость работы по протоколу Telnet средствами PHP.

Для этой цели уже многие годы существует библиотека/класс PHP Telnet скачать ее можно https://www.geckotribe.com/php-telnet/

Работа с Telnet происходит через сокеты.

Рассмотрим пример работы данного класса

Перевод и пояснения стандартной справки к этой библиотеке

include './PHPTelnet.php';

// Инициализация класса

$telnet = new PHPTelnet();

// Подключение к серверу, в случае ошибки будет возвращен ее код

$result = $telnet->Connect('127.0.0.1','login name','password');

if ($result == 0) {

//Выполняем первую команду и выводим ее результат на экран

$telnet->DoCommand('enter command here', $result);

echo $result;

// Выполняем вторую команду

$telnet->DoCommand('another command', $result);

echo $result;

// Отключаемся от сервера, в случае когда завершение сеанса происходит по команде exit $telnet->Disconnect(1)

// Зависит от Telnet сервера

$telnet->Disconnect();

}

При работе с разными устройствами возникают проблемы, обусловленные спецификой работы Telnet-протокола. Самая частая - это соединение через Socket установлено, но нет возможности отправлять команды.

Обусловлено это не завершенным согласованием между сервером и клиентом. Из опыта работы заметил, что подобное происходит, когда сервер на этапе согласования запрашивает тип терминала клиента (Wireshark ее определил как "Send Your Terminal Type" Код - fa 18 01)

Исходя из этих проблем, был написан свой класс для работы, который Вы можете скачать по ссылке php_telnet или https://drive.google.com/file/d/1XDs1ZQajLmsGXbPBjZQqjwGSIcM9z513/view?usp=sharing , его работа была протестирована в 2019 году на нескольких типах устройств.

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

Пример работы с ним

include_once './phptelnet_puh.php';

//Инициализируем класс и подключаемся к серверу

$telnet= new php_telnet('127.0.0.1','login name','password');

// В случае отсутствия ошибок подключения выполняем команды

if (!$telnet->err_num){

// Метод do_comand принимает 2 аргумента: команда и необходимость вернуть результат, в случае когда 2-й аргумент не указан, результат выполнения возвращаться не будет

echo $telnet->do_comand("'enter command here r", true);

//отключение от сервера с указанием команды завершения сеанса, если команда не указана, произойдет обрыв соединения

$telnet->disconect('exit');

}

Если у Вас есть замечания или предложения, пишите их в комментариях.

1 комментарий:

  1. Постраничный вывод не работает. Только первую страницу текста выдает, да и то только после того, как произойдет отлуп обратно в командную строку.

    ОтветитьУдалить