LAN内のすべてのアクティブなホストを一覧表示する簡単なスクリプトが欲しいのですが、少し迷っています。他の投稿から、SNMPを使用してDHCPサーバー(私の場合はLancomルーター)をポーリングすることで、これを最も効果的に実行できることがわかりました。
しかし、私はPHPのSNMPコマンドに精通していません。snmpwalk()は正しい関数ですか?snmpwalk()または他のphp関数を取得して、すべてのライブホストのリストを含む配列を返すことはできますか?
そこで、Lancomルーターをプローブして、DHCP/BOOTPテーブルを引き出すスクリプトを作成しました。そのようなルーターを監視する必要があるすべての人に使用される可能性があるため、私はそれを共有しています。また、素敵なHTMLテーブルを出力します。この関数BetterTable()
は、任意の2D配列で使用できます。
ルーターでスクリプトを使用するには、IP、ユーザーID、およびpwd(最初の3つの変数)を設定する必要があります。
<?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>';
}
?>
ライブホストの検索
すべてのライブホストを確実に取得するための最良のping
方法は、のようなツールを使用してサブネットをスイープすることですnmap
。Windowsホストはデフォルトでpingに応答しないため、簡単なTCPポートスキャンも含まれています。Linux CLIの構文は次のとおりですnmap -sP 192.0.2.0/24
(192.0.2.0/24の代わりにサブネットを使用してください)。
SNMPクエリ
SNMPが実際に問題を解決するとは思いませんが、私が支援できることを含めます... PHP SNMP拡張機能を使用する場合、最初に正しい情報でテーブルのOIDを知る必要があります。LANCOM -1711-MIBは1つの可能性ですが、確実に知ることは困難です。ポーリングするSNMPOIDがわからない場合は、LANCOMサポートに連絡する必要があります。
staDhcpLanIpadd
(OID:1.3.6.1.4.1.2356.500.2.1712.1.32.21.1.2)が必要なOIDであると仮定してみましょう。この時点で、snmpwalk
SNMPv2cと構成したSNMPコミュニティを使用するルーターになります。おそらく、このOIDは、発行されたDHCPアドレスのリストを提供します。ただし、ルーターをポーリングしたときにそれらが稼働していることを意味するわけではありません(誰かがケーブルを抜いたか、電源を切った可能性があります)。