phpseclib - не удается подключиться к коммутатору cisco

Я пытаюсь использовать phpseclib для подключения к коммутатору cisco SF308. Я использую эту библиотеку для успешного подключения к некоторым коммутаторам HP, но по какой-то причине она просто не работает с моим cisco. Вот код:

 set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
 include('/var/www/phpseclib/Net/SSH2.php');
 define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); //add near include lines
 $cisco = new Net_SSH2('10.10.10.10');

 if (!$cisco->login('username', 'password')) {
     exit('Login Failed');
 }

 echo $cisco->write('\n');

 echo $cisco->write('help');
 echo $cisco->read('/([0-9A-Z\-])*(#)(\s*)/i', NET_SSH2_READ_REGEX);  
 echo $cisco->data;
 echo $cisco->getLog();
 echo $cisco->disconnect();

Он всегда умирает с сообщением об ошибке Login Failed.

Я попытался добавить некоторые операторы отладки в саму библиотеку NET_SSH2, и она умерла с ошибкой номер 51, которая определяется как «NET_SSH2_MSG_USERAUTH_FAILURE».

Одна вещь, которая отличается между коммутаторами hp и этой cisco, заключается в том, что при ручном подключении hp достаточно «умна», чтобы подобрать имя пользователя из начальной команды ssh. Например, если вы должны были сделать это в командной строке:

 ssh [email protected]

а затем нажмите Enter, он подберет «имя пользователя» в качестве имени пользователя и запросит у вас только пароль. С коммутатором cisco (модель SF302-08) он по-прежнему запрашивает как имя пользователя, так и пароль. Как только я укажу имя пользователя во второй раз, а затем пароль, я смогу подключиться к коммутатору.

Я не уверен, что именно это вызывает проблему, но это явно отличается между двумя переключателями. Я пытаюсь найти документацию для cisco, чтобы узнать, есть ли способ изменить это / заставить его выбрать имя пользователя в первоначальном запросе на подключение. Но если у вас есть другие предложения, пожалуйста, дайте мне знать! Я весь во внимании.

Спасибо.

ИЗМЕНИТЬ 1

Я включил комплексное ведение журнала и получил полную информацию о том, где происходит сбой, на случай, если это поможет. Вот мой последний код:

 set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
 include('Net/SSH2.php');
 define('NET_SSH2_LOGGING', true); //turn on logging.

 $ssh = new Net_SSH2('10.10.10.10'); //starting the ssh connection to localhost
 if (!$ssh->login('username', 'password')) { //if you can't log on...
    echo('Login Failed');
    echo 'Error message is: <br>';
    $log = $ssh->getLog(NET_SSH2_LOG_COMPLEX);
    foreach ($log as $logitem)  {
             echo $logitem.'<br>';
     }

Это возвращает следующий вывод:

 Login FailedError message is:
 <-
 ->
 <- NET_SSH2_MSG_KEXINIT (0.0118s)
 -> NET_SSH2_MSG_KEXINIT (0s)
 -> NET_SSH2_MSG_KEXDH_INIT (0s)
 <- NET_SSH2_MSG_KEXDH_REPLY (0.7912s)
 -> NET_SSH2_MSG_NEWKEYS (0s)
 <- NET_SSH2_MSG_NEWKEYS (0s)
 -> NET_SSH2_MSG_SERVICE_REQUEST (0s)
 <- NET_SSH2_MSG_SERVICE_ACCEPT (0.4927s)
 -> NET_SSH2_MSG_USERAUTH_REQUEST (0s)
 <- NET_SSH2_MSG_USERAUTH_FAILURE (0.0059s)

Таким образом, он связывается с коммутатором, но, как было упомянуто в моем первоначальном сообщении, он терпит неудачу при попытке аутентификации имени пользователя/пароля.


person dot    schedule 04.10.2012    source источник


Ответы (3)


После некоторых исследований, вот решение нашей проблемы. Другие, возможно, решили по-другому, но это, кажется, работает для нас.

Мы заметили следующее:

  1. популярные библиотеки ssh, такие как phpseclib, не работали на этом коммутаторе из-за ограниченной реализации ssh.

  2. Функция ssh2_auth_none в php возвращает значение TRUE для этого переключателя.

Что это значит?

Кажется, что протокол ssh имеет метод аутентификации, который называется «нет». Это небезопасно и обычно отключено на большинстве коммутаторов. Функция ssh2_auth_none() пытается подключиться без какой-либо аутентификации, и если это не удается, она возвращает список методов аутентификации, которые принимает сервер. В случае SF300.. он проходит и ничего не возвращает для методов аутентификации.

  1. Известные ограничения CLI и SSH

Хотя они не смогли предоставить нам решение, техническая поддержка CISCO прямо заявила, что коммутаторы малого бизнес-класса имеют ограниченный интерфейс командной строки и урезанную версию SSH, поэтому вы не можете рассматривать его как коммутатор корпоративного уровня, который имеет полномасштабная реализация ssh.

Если это поможет, вот небольшой фрагмент кода, показывающий, как подключиться к этим типам устройств:

    <?php

      $username = 'myusername';

      $password = 'mypassword';

      $connection = ssh2_connect('123.123.123.123', 22);

      //$authentication_methods = ssh2_auth_none($connection, 'user');

      $stdio_stream = ssh2_shell($connection);

      fwrite($stdio_stream,$username."\n");

      sleep(1);

      fwrite($stdio_stream,$password."\n");

      sleep(1);

      echo "Results: " . stream_get_contents($stdio_stream); 
      echo 'sending show bonjour command:<br>';
     fwrite($stdio_stream, "show bonjour".PHP_EOL); //you can use \n instead of PHP_EOL but PHP_EOL is recommended.

     sleep(1);

     echo "<br>Results: " . stream_get_contents($stdio_stream); 

    ?>

Надеюсь, это поможет всем, кто пытается программно подключиться к этим типам устройств.

person dot    schedule 15.11.2012

Я не знаком с библиотекой, которую вы используете, но мне приходилось писать сценарии для маршрутизаторов Cisco с помощью Perl. Для этого я использовал модуль Net::Telnet::Cisco, который имеет дело с некоторыми особенностями взаимодействия с устройством Cisco. Когда я подключился к устройству Cisco Nexus, а не к обычному устройству IOS, это сломалось. Мне пришлось исправить это, изменив регулярное выражение, которое модуль использовал для распознавания строк, указывающих, что сеанс telnet ожидает ввода данных пользователем. С помощью Wireshark я смог увидеть точные строки, отправляемые как с устройства IOS, так и с устройства Nexus. Подозреваю, что вам понадобится что-то подобное.

person DaWisePug    schedule 04.10.2012

Я бы проверил правильность используемого вами IP-адреса и проверил, что имя пользователя и пароль имеют разрешение на подключение.

person ajtrichards    schedule 04.10.2012
comment
спасибо за ответ. В своем посте я пытался намекнуть, что когда делаешь вручную, все работает... просто по-другому. Я отредактирую свой пост, чтобы сделать его более очевидным. Но да, у меня есть правильный IP-адрес и учетные данные. - person dot; 04.10.2012