0

我试图弄清楚如何连接到对 RADIUS 服务器进行身份验证的 CISCO 交换机。这不是工业级开关,而是用于小型企业的。

我一直在为我的其他开关使用 phpseclib,但由于这个特定开关的工作方式存在一些差异,我正在考虑推出我自己的解决方案。

我有以下基本代码:

  <?php
  echo "attempt connect....<br>";

  Try{

        $connection = ssh2_connect('10.14.3.45', 22);
        var_dump($connection);
        echo "attemp ssh2 authorization....<br>";

       echo ssh2_auth_password($connection, 'CANNetworkInfra', 'fe8CC+ad4aA9');
       exit;
       $stream = ssh2_exec($connection, 'show bonjour');
       $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

       // Enable blocking for both streams
       stream_set_blocking($errorStream, true);
       stream_set_blocking($stream, true);

      // Whichever of the two below commands is listed first will receive its appropriate output.  The second command receives nothing
      echo "Output: " . stream_get_contents($stream);
      echo "Error: " . stream_get_contents($errorStream);

      // Close the streams       
      fclose($errorStream);
      fclose($stream);  
     }
     catch (Exception $ex)
     {
       echo 'doing a var dump:';
        var_dump($connection);
      }

此代码因以下错误消息而死:

警告:ssh2_auth_password() [function.ssh2-auth-password]:在第 10 行的 /var/www/test/customssh.php 中使用密码对用户名进行身份验证失败

我认为问题与交换机总是在寻找一个公钥这一事实有关——我们没有使用它,因为我们想对一个半径服务器进行身份验证。手动连接时似乎发生的事情是这样的:

  1. 我们在终端窗口中运行以下命令:“ssh username@ipaddress”
  2. 开关检查 /home/username/.ssh/id_rsa 的默认文件夹中的公钥
  3. 它没有找到该文件,因此交换机会提示我们输入用户名。我们再次输入。
  4. 然后它会提示输入密码。
  5. 在我们提供正确的密码后,它会连接。

我们还没有找到方法来禁用交换机上的公钥检查。所以我的问题是,有没有办法通过 ssh2_auth_password() 发送用户名两次,这样我们就可以模拟我们手动连接的操作?

谢谢。

4

1 回答 1

0

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

我们注意到以下关于这个特定系列的 CISCO 交换机 (SF300)

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

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

这是什么意思?

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

  1. 已知的 CLI 和 SSH 限制

尽管他们无法为我们提供解决方案,但 CISCO 技术支持确实明确指出,小型企业级交换机具有有限的 CLI 和精简版的 SSH,因此您不能将其视为具有一个完整的 ssh 实现。

如果有帮助,这里有一小段代码展示了如何连接到这些类型的设备:

'; fwrite($stdio_stream, "show bonjour".PHP_EOL); //您可以使用 \n 代替 PHP_EOL,但建议使用 PHP_EOL。睡眠(1);回显“
结果:”。stream_get_contents($stdio_stream); ?>

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

于 2012-11-15T14:55:48.827 回答