我想要一个列出局域网中所有活动主机的快速脚本,但我有点迷茫。从其他帖子中,我认为这可以通过使用 SNMP 轮询 DHCP 服务器(在我的情况下是 Lancom 路由器)来最有效地完成。
但是,我不熟悉 PHP 中的 SNMP 命令。snmpwalk() 是正确的功能吗?我可以让 snmpwalk() 或任何其他 php 函数返回一个包含所有活动主机列表的数组吗?
寻找直播主持人
确保获得所有活动主机的最佳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 地址列表;但是,这并不意味着它们在您轮询路由器时处于活动状态(可能有人拔掉了电缆,或将它们关闭)。
所以我写了一个脚本来探测 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>';
}
?>