Иногда возникает необходимость работы по протоколу 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');
}
Если у Вас есть замечания или предложения, пишите их в комментариях.
Постраничный вывод не работает. Только первую страницу текста выдает, да и то только после того, как произойдет отлуп обратно в командную строку.
ОтветитьУдалить