phpseclib - 无法连接到cisco开关

时间:2012-10-04 12:36:50

标签: php cisco phpseclib

我正在尝试使用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进行死亡,错误编号为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)

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

3 个答案:

答案 0 :(得分:2)

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

我们注意到以下内容:

    由于ssh实现有限,
  1. 像phpseclib这样的流行ssh库在这个交换机上失败了。

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

  3. 这是什么意思?

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

    1. 已知的CLI和SSH限制
    2. 尽管他们无法为我们提供解决方案,但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); 
      
          ?>
      

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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