Мне нужно подключиться к коммутатору cisco с помощью php и выполнить команду show interface status
и получить результаты. Я пробовал некоторые классы php, которые я нашел в Интернете, но ни один из них не мог подключиться к устройству. Поэтому я попытался написать сценарий сам, но у меня такая же проблема, я не могу подключиться к устройству.Переключатель Telnet to cisco с использованием php
Хост посылает мне сообщение баннера, а затем новую строку с username:
. Я отправляю свое имя пользователя с \r\n
, жду некоторое время и пытается прочитать данные, но мне кажется, что хост просто игнорирует мои новые персонажи. Это ответ, который я получил (взрываются («\ п») на ответ):
Array
(
[0] => %
[1] => User Access Verification
[2] => Username: timeout expired!
)
Почему я не получить приглашение на пароль? Я попробовал его с отправкой заголовков telnet и без изменений. Кто-нибудь может мне помочь, пожалуйста!
Вот мой код
<?
$host = "switchName";
$name = "name";
$pass = "pass";
$port = 23;
$timeOut = 15;
$connected = false;
$skipNullLines = true;
$timeout = 125000;
$header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x41).chr(0x4E).chr(0x53).chr(0x49).chr(0xFF).chr(0xF0);
$header2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
function read_string()
{
global $fw,$host,$skipNullLines;
$string = "";
while(!feof($fw))
{
$read = fgets($fw);
$string .= $read;
// Probably prompt, stop reading
if(strpos($read, ':') !== FALSE || strpos($read, '> (enable)') !== FALSE || strpos($read, $host.'#') !== FALSE)
{ break; }
}
$string = explode("\n", $string);
// Get rid of null lines
$ret = array();
for($i = 0; $i<count($string); $i++)
{
if(trim($string[$i]) == '' && $skipNullLines) continue;
$ret[] = $string[$i];
}
return $ret;
}
function send_string($string, $force=false)
{
GLOBAL $timeout,$fw;
$string = trim($string);
// execute only strings that are preceded by "show" (if not forced)
if(!$force && strpos($string, 'show ') !== 0)
{
return 1;
}
fputs($fw, $string."\r\n");
echo("SEND:".$string."\r\n");
usleep($timeout);
}
$fw = fsockopen($host, $port, $errno, $errorstr, $timeOut);
if($fw == false)
{
echo("Cant connect");
}
else
{
echo("Connected<br>");
$connected = true;
stream_set_timeout($fw, $timeout);
// fputs($fw, $header1);
// usleep($timeout);
// fputs($fw, $header2);
// usleep($timeout);
print_r(read_string());
send_string("test", true);
print_r(read_string());
}
fclose($fw);
?>
UPDATE Если я посылаю имя сначала, а потом я прочитал, я получаю запрос на ввод пароля. Я не понимаю этого, почему не могу сначала прочитать сообщения от хоста, а затем отправить свой ответ. То, как это работает со мной сейчас (отправить ответ, а затем прочитать для подсказки), не имеет смысла! (и я все еще получил сообщение «% Authentication failed.» с правильным паролем/именем).
...
$connected = true;
stream_set_timeout($fw, $timeout);
send_string("name", true);
send_string("password", true);
print_r(read_string());
...