1

我正在尝试使用 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

然后回车,它会选择“用户名”作为用户名,它只会提示你输入密码。使用 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)

所以它正在联系交换机,但正如我在最初的帖子中提到的那样,它在尝试验证用户名/密码时失败了。

4

3 回答 3

2

经过一番研究,这是我们问题的解决方案。其他人可能以不同的方式解决了问题,但这似乎对我们有用。

我们注意到以下内容:

  1. 由于 ssh 实现有限,流行的 ssh 库(如 phpseclib)在此开关上失败。

  2. php 的 ssh2_auth_none 函数在此开关上返回 TRUE。

这是什么意思?

似乎 ssh 协议有一种身份验证方法,称为“无”。这是不安全的,并且通常在大多数交换机上被禁用。ssh2_auth_none() 函数尝试在没有任何身份验证的情况下进行连接,如果失败,它会返回服务器接受的身份验证方法列表。在 SF300.. 的情况下,它通过并且不返回任何身份验证方法。

  1. 已知的 CLI 和 SSH 限制

尽管他们无法为我们提供解决方案,但 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); 

    ?>

希望这可以帮助任何试图以编程方式连接到这些类型设备的人。

于 2012-11-15T15:00:21.483 回答
1

我不熟悉您使用的库,但我不得不使用 Perl 使用 Cisco 路由器编写一些脚本。为此,我使用了 Net::Telnet::Cisco 模块,该模块处理与 Cisco 设备交互的一些特性。当我连接到 Cisco Nexus 设备而不是普通的 IOS 设备时,它就坏了。我必须通过更改模块用于识别指示 telnet 会话正在等待用户输入的字符串的正则表达式来修复它。我能够看到使用 Wireshark 从 IOS 设备和 Nexus 设备发送的确切字符串。我怀疑你需要类似的东西。

于 2012-10-04T23:35:46.087 回答
0

我会检查您使用的 IP 地址是否正确,并检查用户名和密码是否有权连接

于 2012-10-04T12:56:37.653 回答