Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 22:16   #1
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию Telnet + PHP(как реализовать??)

День добрый, Господа! и Дамы конечно
Есть такой вопрос у меня к Вам..
Хочу общаться с дальними железками не в терминале, как обычно, и не выполнять некоторые постоянные команды как обезьян на конвейере, а более красиво и целесообразно. Пусть php страничка сама делает половину дела. Безусловно перед тренировкой на кошках начинаю тренироваться на адсл-модеме домашнем, во избежание.
Предварительно походил в модеме телнетом что бы подсмотреть команды, в нем используемые.
Нашел описание работы сокетов в php (ссылку на ресурс обязательно добавлю как вспомню, извините конечно), и на основе этого наваял такую штуку:
PHP код:
<?
    header
('Content-Type: text/plain;');
    
error_reporting(E_ALL E_WARNING);
    
set_time_limit(0);
    
ob_implicit_flush();
    echo 
"-= Client =-\n\n";
    
$address '192.168.1.1';
    
$port    23;
    try {
          echo 
'Create socket ... ';
        
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
        if (
$socket 0) {
            throw new 
Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
        } else {
            echo 
"OK\n";
        }

        echo 
'Connect socket ... ';
        
$result socket_connect($socket$address$port);
        if (
$result === false) {
            throw new 
Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
        } else {
            echo 
"OK\n";
        }
        echo 
'Server said: ';
        
$out socket_read($socket1024);
        echo 
$out."\n";
       
//--Первым делом модем спросит логин при подключении, надо его передать
        
$msg "admin";
        echo 
"Say to server ($msg) ...";
        
socket_write($socket$msgstrlen($msg));
        echo 
"OK\n";
       
//--что ответил модем(сервер)
        
echo 'Server said: ';
        
$out socket_read($socket1024);
        echo 
$out."\n";
       
//--должен спросить пароль модем(сервер)
        
$msg 'admin123';
        echo 
"Say to server ($msg) ... ";
        
socket_write($socket$msgstrlen($msg));
        echo 
"OK\n";
        
//--Что отьветил модем на логин-пароль
         
echo 'Server said: ';
        
$out socket_read($socket1024);
        echo 
$out."\n";
        
//--Хочу спросить его версию прошивки, получить ответ и отключится от него
        
$msg "swversion";
        echo 
"Say to server ($msg) ...";
        
socket_write($socket$msgstrlen($msg));
        echo 
"OK\n";
       
        echo 
'Server said: ';
        
$out socket_read($socket1024);
        echo 
$out."\n";
            
$msg "exit";
        echo 
"Say to server ($msg) ...";
        
socket_write($socket$msgstrlen($msg));
        echo 
"OK\n";
        echo 
'Server said: ';
        
$out socket_read($socket1024);
        echo 
$out."\n";
              
    } catch (
Exception $e) {
        echo 
"\nError: ".$e->getMessage();
    }   
    if (isset(
$socket)) {  
        echo 
'Close socket ... ';
        
socket_close($socket);
        echo 
"OK\n";  
    }
?>
После запуска данного кода я получаю в выводе страницы только пяток строк типа
"Xdsl Router --- OK"
и в конце сообщение о том, что сокет закрыт.
Безусловно я понимаю, что все приведенное выше некрасиво, некорректно и т.д.
Подскажите, как правильно это сделать? И где ошибка выше?
--Надо зайти в модем,
сказать логин , потом пароль, потом что то типа версии прошивки или запустить пинг на йандекс, конечно все то что отвечает модем вывести в браузер, и выйти из модема.
Если не затруднит Вас, конечно!
----Сокеты в апаче подключил
----Брал пример отсюда
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".

Последний раз редактировалось bush007; 11.09.2011 в 22:19.
bush007 вне форума Ответить с цитированием
Старый 12.09.2011, 12:42   #2
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Может это поможет.
ssdm вне форума Ответить с цитированием
Старый 12.09.2011, 22:40   #3
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

я с геко начал пробовать, что то не совсем понравилось.
Знаю, что в php работа с сокетами есть уже, и думал зачем лишнее подключать?
спасибо за ответ. Будем копать дальше.
-----------
Мысль конечно ходит, как kod по цепи кругом
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 13.09.2011, 15:25   #4
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

С геко тже не работает ?
Геко телнет - простейшая реализация интерфейса общания по телнету через те же сокеты.
Ктстаи - покажите все что страница выводит.
ssdm вне форума Ответить с цитированием
Старый 13.09.2011, 18:10   #5
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

-= Client =-

Create socket ... OK
Connect socket ... OK, подключаемся
Сервер сказал: яэяэ!яыяыxDSL Router
Login: Server said:
---------- на этом страница висит----------
Конечно экспериментировал много с кодом выше.
Что то я упустил, какойто один момент. вроде того, что в определенном месте надо читать сообщение сервера вплоть до того, пока прием не закончится.
или же надо в определенных местах спать секунду что бы все сообщение пришло.
И кстати странно то, что везде так и описывают телнет в php так легко сделать, что ни одного рабочего примера с рабочей железкой я не нашел
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 14.09.2011, 20:12   #6
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

С геко тже не работает ? ---
вчера прикрутил гекко.
даже смеялся потом -- 4 команды (логин, пароль, хелп и версию посмотреть) выполнял 11 секунд. Ну я даже сам в телнете быстрей руками это сделаю. (модем под столом стоит).
Нет, я не утверждаю что я все правильно сделал а гекко неправ. вариантов много конечно. может специально там задержка стоИт и я не разобрался до конца.
Но хочется что бы жжиик! и готово
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 15.09.2011, 13:13   #7
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
Сообщение от bush007 Посмотреть сообщение
С геко тже не работает ? ---
вчера прикрутил гекко.
даже смеялся потом -- 4 команды (логин, пароль, хелп и версию посмотреть) выполнял 11 секунд. Ну я даже сам в телнете быстрей руками это сделаю. (модем под столом стоит).
Нет, я не утверждаю что я все правильно сделал а гекко неправ. вариантов много конечно. может специально там задержка стоИт и я не разобрался до конца.
Но хочется что бы жжиик! и готово
Да. Там стоит задержка. Но вы можете её отключить или выставить свой интервал ожидания.
Вы вообще класс то разобрали ? Там кода на 100 строчек. И вопросы все сразу отпадут.
ssdm вне форума Ответить с цитированием
Старый 15.09.2011, 17:48   #8
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

ну я и говорю, что "может специально там задержка стоИт и я не разобрался до конца."
а хочется что бы жжиик! и готово.
Спасибо за ответы! получится что путное -- сразу отвечу по результату, с измерениями времени выполнения.
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 15.11.2011, 00:43   #9
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

Извините за поздний ответ, все руки не доходили.
Итак: используем гекко.
В скрипте гекко(см. выше) надо поменять цифру "0" на "1":
PHP код:
var $use_usleep=1
, что уменьшает время выполнения скрипта в два раза.
В данном примере :
1. коннект к оборудованию телнетом (в данном случае это адсл модем длинк),
2. выполнение команды в модеме с отображением результата.(в данном случае пинг гугла).
3. Вывод времени выполнения приложения (на всяк случай).
//------------------------------------------------

PHP код:
<?php
//start count time-------------------------------//
$start_time microtime(true);
//------------------------------------------------//
require_once ("PHPTelnet.php"); 
    
$Telnet = new PHPTelnet();     
    
$result $Telnet->Connect("192.168.1.100""admin""admin");     
    switch (
$result) {
    case 
0:    
    
$Telnet->DoCommand("admin\n"$result);
    
sleep (1);
        
$Telnet->DoCommand("admin\n"$result);    
        
$Telnet->DoCommand("ping google.ru\n"$result);
        
sleep (3);// надо дать время для завершения команды!!!
    
echo "<p style='text-align: left;'>".str_replace("\n""<br/>"$result)."</p>";    
    
$Telnet->DoCommand("exit\n"$result);
        echo 
"<p style='text-align: left;'>".str_replace("\n""<br/>"$result)."</p>";
    break;
    }     
    
$Telnet->Disconnect();
//start out time--------------------------------------//
$exec_time microtime(true) - $start_time;
//Выводим не экран
printf ("Страница сгенерирована за %f секунд !"$exec_time); 
?>
------------------результат_в_браузере--------------------

ping google.ru
PING google.ru (173.194.32.49): 56 data bytes
56 bytes from 173.194.32.49: icmp_seq=0 ttl=58 time=55.8 ms
56 bytes from 173.194.32.49: icmp_seq=1 ttl=58 time=55.6 ms
56 bytes from 173.194.32.49: icmp_seq=2 ttl=58 time=55.8 ms
56 bytes from 173.194.32.49: icmp_seq=3 ttl=58 time=55.6 ms

--- google.ru ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 55.6/55.7/55.8 ms
exit

>
> exit

Bye bye. Have a nice day!!!


Страница сгенерирована за 6.000938 секунд !

------------------------------------------------------------
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".

Последний раз редактировалось bush007; 15.11.2011 в 00:47.
bush007 вне форума Ответить с цитированием
Старый 14.03.2013, 10:29   #10
pensotv
Новичок
Джуниор
 
Регистрация: 14.03.2013
Сообщений: 1
По умолчанию

Я тоже попробовала со своими командами опроса настроек DSLAM.

Код:
switch ($result) {
   case 0:
/*
      $telnet->DoCommand('display vlan all', $result);
      sleep (20);
      fputs ($fp, $result);
      $telnet->DoCommand(" \n", $result);
      sleep (30);
      fputs ($fp, $result);
      $telnet->DoCommand(" \n", $result);
      sleep (20);
      fputs ($fp, $result);

      $telnet->DoCommand("display board 0/1 ", $result);
      sleep(20);
      fputs ($fp, $result);
      $telnet->DoCommand(" ", $result);
      sleep (20);
      fputs ($fp, $result);
      $telnet->DoCommand(" ", $result);
      sleep (20);
      fputs ($fp, $result);
      sleep (5);


      $telnet->DoCommand("display board 0 \n", $result);
      sleep(10);
      fputs ($fp, $result);
      sleep (5);
*/

      $telnet->DoCommand("display adsl line-profile", $result);
      sleep (20);
      fputs ($fp, $result);
      $telnet->DoCommand(" ", $result);
      sleep (20);
      fputs ($fp, $result);
      $telnet->DoCommand(" ", $result);
      sleep (20);
      fputs ($fp, $result);
//      $telnet->DoCommand("\n", $result);
      sleep (20);

/*
      $telnet->DoCommand('display vlan 1 ', $result);
      sleep (5);
      fputs ($fp, $result);
      $telnet->DoCommand(" ", $result);
      sleep (5);
      fputs ($fp, $result);
      sleep (5);
*/
echo "<p style='text-align: left;'>".str_replace("\n", "<br/>",$result)."</p>";

      $telnet->DoCommand("quit\n", $result);
      fputs ($fp, $result);

echo "<p style='text-align: left;'>".str_replace("\n", "<br/>",$result)."</p>";
      $telnet->DoCommand("y\n", $result);
echo "<p style='text-align: left;'>".str_replace("\n", "<br/>",$result)."</p>";

      break;
}
На команды -display board 0/1 - и -display board 0 - ответ получила в виде таблиц
(записывала в файл).
А с другими командами проблема -
в файл записывается -

display adslline-profile
^
% Unknown command, the error locates at '^'

или
display vlanall
^
% Unknown command, the error locates at '^'

или
display vlan1
^
% Unknown command, the error locates at '^'

В команде теряется пробел в конце мжд словами.
И что ж делать?
pensotv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP - как реализовать *Мои Друзья* ?? Wardrag PHP 5 08.12.2010 03:49
telnet или whois в VBA как? hardstep Microsoft Office Excel 2 27.09.2010 19:38
как в javascript реализовать php-функцию preg_match()? sarkozy JavaScript, Ajax 3 25.05.2010 23:27
Кнопки как RadioButton'ы в GroupBox'e. Как реализовать? Casper-SC Общие вопросы .NET 9 06.03.2010 20:07
Нужно реализовать на php такую штуку samiro PHP 2 08.02.2008 22:51