Я пытаюсь использовать 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();
Он всегда умирает с сообщением об ошибке входа в систему.
Я попытался добавить некоторые отладочные заявления в библиотеке NET_SSH2 и его умирании с номером ошибки 51, который определяется как «NET_SSH2_MSG_USERAUTH_FAILURE».
Единственное отличие между hp-переключателями и этим cisco заключается в том, что при подключении вручную hp достаточно «умный», чтобы забрать имя пользователя из начальной команды ssh. Например, если вы должны сделать это в командной строке:
ssh username@10.10.10.10
а затем нажмите 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>'; }
в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)
Поэтому он обращается к коммутатору, но, как упоминалось в моем первоначальном сообщении, он не работает, пытаясь аутентифицировать имя пользователя / пароль.
Я не знаком с библиотекой, которую вы используете, но мне пришлось записывать некоторые вещи с маршрутизаторами Cisco, используя Perl. Для этого я использовал модуль Net :: Telnet :: Cisco, который имеет дело с некоторыми особенностями взаимодействия с устройством Cisco. Когда я подключился к устройству Cisco Nexus, скорее, это обычное устройство IOS, это сломалось. Я должен был исправить это, изменив регулярное выражение, используемое модулем для распознавания строк, которые указывают, что сеанс telnet ожидает ввода пользователем. Я смог видеть, что точные строки отправляются как с устройства IOS, так и с устройства Nexus с использованием Wireshark. Я подозреваю, что вам нужно что-то подобное.
После некоторых исследований, вот решение нашей проблемы. Другие, возможно, решили по-другому, но это, похоже, работает для нас.
Мы заметили следующее:
популярные ssh-библиотеки, такие как phpseclib, терпели неудачу на этом коммутаторе из-за ограниченной реализации ssh.
Функция ssh2_auth_none php возвращает TRUE на этом коммутаторе.
Что это значит?
Похоже, что протокол ssh имеет метод аутентификации, называемый «none». Это небезопасно и обычно отключается на большинстве коммутаторов. Функция ssh2_auth_none () пытается подключиться без какой-либо проверки подлинности, и если она терпит неудачу, она возвращает список методов проверки подлинности, которые принимает сервер. В случае SF300 .. он передает и ничего не возвращает для методов аутентификации.
Хотя они не смогли дать нам решение, техническая поддержка CISCO явно заявила, что коммутаторы класса малого бизнеса имеют ограниченный CLI и упрощенную версию 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); ?>
Надеюсь, это поможет любому, кто пытается подключиться к этим типам устройств программным путем.
Я бы проверил правильный IP-адрес, который вы используете, и проверьте, что имя пользователя и пароль имеют разрешение на подключение.