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

Статус
В этой теме нельзя размещать новые ответы.

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($socket, 1024)."\n"; // Print result
                }
        }
?>
Скрипт логинится на маршрутизаторе и отправляет одну команду. На этом всё. А нужно чтобы в цикле отправлял столько команд, сколько заложено и выводил результат на экран, затем отсылал команду "exit" и заканчивал работу. Что я делаю не так?
 
какую именно команду выполняет скрипт, то есть для какого адреса?
 
можно смастерить 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:
 
какую именно команду выполняет скрипт, то есть для какого адреса?
скрипт должен отправлять команду ping 192.168.0.x пока не переберет все адреса, где x равен от 0 до 255

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

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

Добавлено через 29 минут
telnet класс у меня почему то не работает под windows, вернее функция из него "setLog"
 
исходя из логики скрипта, вы вначале отправляете 254 раза команду пинг для разных адресов, а уже после пытаетесь считать результат, на сколько это верно мне не удалось узнать, так как нет такой возможности :), по крайней мере я бы пытался считывать сразу после отправки команды :), к тому же следовало бы добавить проверку при считывание из сокета, что функция fgets не возвращает false

по классу telnet, в нем необходимо подправить строки
с
PHP:
$this->repertoireLog =  "/log/" . date("m");
на
PHP:
$this->repertoireLog =  "/log/";

с
PHP:
if (mkdir($this->repertoireLog, 0700) === false){
на
PHP:
if (mkdir($this->repertoireLog) === false){

с
PHP:
            $this->nomFichierLog =     date("d") . "_" .
                date("H:i:s") . "_" .
на
PHP:
            $this->nomFichierLog =     date("d") . "_" .
                date("His") . "_" .
 
  • Нравится
Реакции: SXS
исходя из логики скрипта, вы вначале отправляете 254 раза команду пинг для разных адресов, а уже после пытаетесь считать результат, на сколько это верно мне не удалось узнать, так как нет такой возможности :), по крайней мере я бы пытался считывать сразу после отправки команды :), к тому же следовало бы добавить проверку при считывание из сокета, что функция fgets не возвращает false
Судя по всему отправить просто команды нельзя, нужно сначала дождаться приглашения затем отправить команду. Можно ли как то получить последний символ из сокета? Т.е приглашение выглядит как "Router>" И нужно при появлении ">" только тогда отправить "ping 192.168.0.x" К сожелению fseek а затем fgetc не работают с сокетами... Может есть другой способ?
по классу telnet, в нем необходимо подправить строки
класс так и не заработал... не работает даже пример который с ним идет, хотя при выполнении не возникает ошибок.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху