Telnet управление с помощью PHP

Тема в разделе "PHP", создана пользователем SXS, 7 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. SXS

    SXS Создатель

    Регистр.:
    2 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Пишу программу для управления маршрутизатором Cisco по telnet чтобы упростить многие рутинные действия. Знаю что для этого есть другие языки, но очень хотелось бы на PHP. Вот что есть на данный момент:
    PHP:
    <?php
    $host 
    "192.168.0.77"
    $port    23;
    $TimeOut 10;
    $ip "192.168.0.";
    $start 1;
    $end 254;
    $socket fsockopen($host$port$errno$errstr$TimeOut); // Connecting
    if(!$socket)
            {
            echo 
    "Connection failed!!!\n";
            exit();
            }
    else
            {
            echo 
    "Connected $host ...\n";
            
    sleep(4); // Wait prompt "Password:"
            
    fputs ($socket"123\n"); // Send password
    for ($i=$start$i<=$end$i++) {
        
    fputs ($socket"ping ".$ip.$i."\n"); // Send command
    }
           
    // fputs ($socket, "exit\n"); // Send command "exit"
            
    while (!feof($socket))
                    {
                   echo 
    " ".fgets($socket1024)."\n"// Print result
                    
    }
            }
    ?>
    Скрипт логинится на маршрутизаторе и отправляет одну команду. На этом всё. А нужно чтобы в цикле отправлял столько команд, сколько заложено и выводил результат на экран, затем отсылал команду "exit" и заканчивал работу. Что я делаю не так?
     
  2. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    какую именно команду выполняет скрипт, то есть для какого адреса?
     
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    можно смастерить expect скрипт, типа:
    Код:
    #!/usr/bin/expect --
    # Test expect script to telnet.
    
    spawn telnet **.***.**.**
    expect "login:"
    send "usert\r"
    expect "Password:"
    send "asdfasd\r"
    expect "mrt>"
    #send "bash; date ; echo hello, drl.\r"
    send "bash;echo drl.\r"
    expect "bash-3.00#"
    send "date ; echo hello, drl.\r"
    expect "bash-3.00#"
    send "exit\r"
    # end of expect script.
    
    и запустить скрипт через шелл в php:
    PHP:
    $exec shell_exec("/usr/bin/expect -d -f /home/site/www/test.sh 2>&1");
    или сразу в cron записать это командную строку

    ещё есть всякие классы для telnet:

    http://www.php.net/manual/en/function.fsockopen.php#46369
     
  4. SXS

    SXS Создатель

    Регистр.:
    2 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    скрипт должен отправлять команду ping 192.168.0.x пока не переберет все адреса, где x равен от 0 до 255

    и вот запустить это в цикле не получается :nezn:

    Эта команда - пример, если получится с ней, значит будет работать и та что мне нужна...

    Добавлено через 29 минут
    telnet класс у меня почему то не работает под windows, вернее функция из него "setLog"
     
  5. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    исходя из логики скрипта, вы вначале отправляете 254 раза команду пинг для разных адресов, а уже после пытаетесь считать результат, на сколько это верно мне не удалось узнать, так как нет такой возможности :), по крайней мере я бы пытался считывать сразу после отправки команды :), к тому же следовало бы добавить проверку при считывание из сокета, что функция fgets не возвращает false

    по классу telnet, в нем необходимо подправить строки
    с
    PHP:
    $this->repertoireLog =  "/log/" date("m"); 
    на
    PHP:
    $this->repertoireLog =  "/log/"
    с
    PHP:
    if (mkdir($this->repertoireLog0700) === false){
    на
    PHP:
    if (mkdir($this->repertoireLog) === false){
    с
    PHP:
                $this->nomFichierLog =     date("d") . "_" .
                    
    date("H:i:s") . "_" .
    на
    PHP:
                $this->nomFichierLog =     date("d") . "_" .
                    
    date("His") . "_" .
     
    SXS нравится это.
  6. SXS

    SXS Создатель

    Регистр.:
    2 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Судя по всему отправить просто команды нельзя, нужно сначала дождаться приглашения затем отправить команду. Можно ли как то получить последний символ из сокета? Т.е приглашение выглядит как "Router>" И нужно при появлении ">" только тогда отправить "ping 192.168.0.x" К сожелению fseek а затем fgetc не работают с сокетами... Может есть другой способ?
    класс так и не заработал... не работает даже пример который с ним идет, хотя при выполнении не возникает ошибок.
     
Статус темы:
Закрыта.