0

我想要一个列出局域网中所有活动主机的快速脚本,但我有点迷茫。从其他帖子中,我认为这可以通过使用 SNMP 轮询 DHCP 服务器(在我的情况下是 Lancom 路由器)来最有效地完成。

但是,我不熟悉 PHP 中的 SNMP 命令。snmpwalk() 是正确的功能吗?我可以让 snmpwalk() 或任何其他 php 函数返回一个包含所有活动主机列表的数组吗?

4

2 回答 2

2

寻找直播主持人

确保获得所有活动主机的最佳ping方法是使用诸如nmap. 由于默认情况下 Windows 主机不响应 ping,因此它还包括一个简短的 TCP 端口扫描。linux CLI 的语法是nmap -sP 192.0.2.0/24(用您的子网代替 192.0.2.0/24)。

SNMP 查询

我认为 SNMP 不能真正解决您的问题,但我会提供我能提供的帮助...当您使用PHP SNMP Extension时,您首先需要知道具有正确信息的表的 OID。LANCOM-1711-MIB是一种可能性,但很难确定;如果您不知道要轮询哪个 SNMP OID,您应该联系 LANCOM 支持。

让我们假设staDhcpLanIpadd(OID: 1.3.6.1.4.1.2356.500.2.1712.1.32.21.1.2) 是您需要的 OID。此时,您将snmpwalk使用 SNMPv2c 的路由器和您在其上配置的 SNMP 社区。大概,这个 OID 为您提供了已发布的 DHCP 地址列表;但是,这并不意味着它们在您轮询路由器时处于活动状态(可能有人拔掉了电缆,或将它们关闭)。

于 2012-06-30T21:11:43.927 回答
2

所以我写了一个脚本来探测 Lancom 路由器并拉出 DHCP/BOOTP 表。它可能适用于所有需要监控此类路由器的人,因此我分享它。它还输出了一个漂亮的 HTML 表格;该函数BetterTable()可用于任何二维数组。

您需要设置 IP、userid 和 pwd(前三个变量)才能在路由器上使用脚本。

    <?php

    $router_ip = '';
    $username = '';
    $password = '';
    $port = 23;
    $timeout = 10;

    $connection = fsockopen($router_ip, $port, $errno, $errstr, $timeout);

    if(!$connection){
     echo "Connection failed\n";
     exit();
    } else {

     fputs($connection, "$username\r\n");
     fputs($connection, "$password\r\n");
     fputs($connection, "cd setup/dhcp/dhcp-table \r\n");
     fputs($connection, "dir \r\n");
     fputs($connection, " ");

     $j = 0;
     while ($j < 16) {
      fgets($connection);
      $j++;
     }
     stream_set_timeout($connection, 2);
     $timeoutCount = 0;
     $content ='';
     $DhcpArray = '';
     (int) $index =0;

    $DhcpFile = "C:\IP-Symcon\webfront\user\images\LancomDhcp.txt";
    $fh = fopen($DhcpFile, 'w') or die("can't open file");

    //$DhcpArray[0] = array ('IP-Address', 'MAC-Address', 'Timeout', 'Hostname', 'Type', 'LAN-Ifc', 'Ethernet-Port', 'VLAN-ID', 'Network-Name');

     while (!feof($connection)){

      $content = fgets($connection);
      $content = str_replace("\r", '', $content);
      $content = str_replace("\n", "", $content);
      $lineArray = explode(' ', $content); 
      if (isValidIp($lineArray [0]))
          { 
          $DhcpArray[$index]['IP-Address'] = substr ($content, 0,17);
          $DhcpArray[$index]['MAC-Address'] = substr ($content, 17,32-18);
          $DhcpArray[$index]['Timeout'] = substr ($content, 31,41-32);
          $DhcpArray[$index]['Hostname'] = substr ($content, 40,108-41);
          $DhcpArray[$index]['Type'] = substr ($content, 107,125-108);
          $DhcpArray[$index]['LAN-Ifc'] = substr ($content, 124,137-125);
          $DhcpArray[$index]['Ethernet-Port'] = substr ($content, 136,152-137);
          $DhcpArray[$index]['VLAN-ID'] = substr ($content, 151,161-152);
          $DhcpArray[$index]['Network-Name'] = substr ($content, 160);
          fwrite($fh, $content);
          $index +=1;
          }

      # If the router say "press space for more", send space char:
      if (preg_match('/MORE/', $content) ){ // IF current line contain --More-- expression,
       fputs ($connection, " "); // sending space char for next part of output.
      } # The "more" controlling part complated.

      $info = stream_get_meta_data($connection);
      if ($info['timed_out']) { // If timeout of connection info has got a value, the router not returning a output.
       $timeoutCount++; // We want to count, how many times repeating.
      }
      if ($timeoutCount >2){ // If repeating more than 2 times,
       break;   // the connection terminating..
      }
     }
     $content = substr($content,410);

     BetterTable($DhcpArray);




    fclose($fh);

    }
    echo "End.\r\n";

    //--------------------------------------------------------------------

    function isValidIp($ip)
    {/* PCRE Pattern written by Junaid Atari */
        return !preg_match ( '/^([1-9]\d|1\d{0,2}|2[0-5]{2})\.('.
                             '(0|1?\d{0,2}|2[0-5]{2})\.){2}(0|1?'.
                             '\d{0,2}|2[0-5]{2})(\:\d{2,4})?$/',
                             (string) $ip )
                ? false
                : true;
    }

    //--------------------------------------------------------------

    function BetterTable($twoDimArray)
    {
    $i = 0;
    echo "<table>
            <table class='BetterTable' border='1'>";

    echo "<tr>";
    echo '<td>Line #
    </td>';
    foreach ($twoDimArray[0] as  $fieldName => $fieldValue)
        {
            echo '<td>'.$fieldName. '</td>';
        }echo '</tr>';
    $i = 0;

    foreach ($twoDimArray as $rowName => $rowValue) 
    {
            if ($i%2 == 0) 
                Echo "<tr bgcolor=\"#d0d0d0\" >";
            else 
                Echo "<tr bgcolor=\"#eeeeee\">";
        $fields = count($twoDimArray[$i]);
        $y = 0;
        echo '<td>'.$i. '</td>';
        foreach ($rowValue as  $fieldName => $fieldValue)
        {
            echo '<td>'.$fieldValue. '</td>';
            $y = $y + 1;
        }
        echo '</tr>';
        $i = $i + 1;
    }


    echo '</table>';
    }


    ?>
于 2012-07-08T15:42:50.287 回答