snmpget

(PHP 4, PHP 5, PHP 7, PHP 8)

snmpget获取一个 SNMP 对象

描述

snmpget(
    字符串 $hostname,
    字符串 $community,
    数组|字符串 $object_id,
    整数 $timeout = -1,
    整数 $retries = -1
): 混合

函数 snmpget() 用于读取由 object_id 指定的 SNMP 对象的值。

参数

hostname

SNMP 代理。

community

读取社区。

object_id

SNMP 对象。

timeout

第一次超时之前的微秒数。

retries

超时发生时重试的次数。

返回值

成功时返回 SNMP 对象值,错误时返回 false

示例

示例 #1 使用 snmpget()

<?php
$syscontact
= snmpget("127.0.0.1", "public", "system.SysContact.0");
?>

参见

添加笔记

用户贡献笔记 16 个笔记

Johann Glaser
20 年前
似乎对于每个 snmpget(),都会打开一个自己的 socket()。这在 snmpget() 完成后不会关闭。后续的 snmpget() 调用也不会重用现有的套接字。

当查询几个端口数量很多交换机时,Apache 的最大文件描述符数量会用尽。因此不再可能进行 snmpget()。此外,此特定 Apache 进程无法再读取任何文件。无论是 PHP 文件、任何包含文件,还是任何其他文件(如 .css 文件,...)。

这可能解释了 tkjode 在 phalnet dot com 上的观察结果。与他的情况不同的是,我使用的是 Linux。
maxie_ro at do dot not dot spam dot yahoo dot com
15 年前
此函数可用于通过获取其 sysObjectID 和 sysDescr 来识别网络上的设备。简而言之,这就是我所做的
<?php
$sysid
= @snmpget($ip, 'public', '.1.3.6.1.2.1.1.2.0', 300);
if(
$sysid) {
$sysdescr = @snmpget($ip, 'public', '.1.3.6.1.2.1.1.1.0', 300);
}
?>

我为设备获得的结果,例如
<?php
$sysid
= 'OID: .iso.3.6.1.4.1.5003.8.1.1.57';// => AudioCodes MP114;
//.iso.3.6.1.4.1. 是 OID 域的“前缀”
//5003 是 AudioCodes 的 IANA 编号
//8.1.1.57 标识设备类型 (MP-114)
$sysdescr = '"Product: MP-114 FXS;SW Version: 5.00A.024"';
?>
不幸的是,并非所有设备都报告正确的 objectID,例如,它们只报告供应商并在此处停止等。

如果您想知道为什么我在函数调用中使用代码 '.1.3.6.1.2.1.1.2.0' 而不是 "sysObjectID.0",那是因为只有数字代码似乎在 Windows 上有效。有关更多代码,请在 Google 上搜索“cisco SNMP 对象导航器”。
玩得开心。
d dot shereck at gmail dot com
15 年前
对于那些希望使用 v2 或 v3 的人

您可以参考 php_snmp.h 头文件
以下是函数列表

PHP_FUNCTION(snmpget);
PHP_FUNCTION(snmpgetnext);
PHP_FUNCTION(snmpwalk);
PHP_FUNCTION(snmprealwalk);
PHP_FUNCTION(snmp_get_quick_print);
PHP_FUNCTION(snmp_set_quick_print);
PHP_FUNCTION(snmp_set_enum_print);
PHP_FUNCTION(snmp_set_oid_output_format);
PHP_FUNCTION(snmpset);

PHP_FUNCTION(snmp2_get);
PHP_FUNCTION(snmp2_getnext);
PHP_FUNCTION(snmp2_walk);
PHP_FUNCTION(snmp2_real_walk);
PHP_FUNCTION(snmp2_set);

PHP_FUNCTION(snmp3_get);
PHP_FUNCTION(snmp3_getnext);
PHP_FUNCTION(snmp3_walk);
PHP_FUNCTION(snmp3_real_walk);
PHP_FUNCTION(snmp3_set);

PHP_FUNCTION(snmp_set_valueretrieval);
PHP_FUNCTION(snmp_get_valueretrieval);
Eduardo
17 年前
在线文档说该函数在错误时返回“FALSE”,但实际上,它在错误时返回 NULL。
ac221 at sussex dot ac dot uk
16 年前
一些 SNMP 代理将 MAC 地址作为十六进制编码的 ASCII 返回。

例如 '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65'

每个八位字节表示 MAC 地址的 4 位。
一些供应商也可能将分隔符编码到字符串中。

以下是一个将这些字符串转换回纯十六进制的函数。

<?php
$hexStr
= '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65';

echo(
str_replace(':','',hexStr2Ascii($hexStr)));

function
hexStr2Ascii($hexStr,$separator = ':'){
$hexStrArr = explode($separator,$hexStr);
$asciiOut = null;
foreach(
$hexStrArr as $octet){
$asciiOut .= chr(hexdec($octet));
}
return
$asciiOut;
}
?>

输出:'0017f29b460e'
michael dot mauch at gmx dot de
17 年前
我不知道超时值是多少,但 1 秒实际上是 1 000 000 000 纳秒(参见 http://en.wikipedia.org/wiki/SI_prefix)。
Jim
18 年前
不幸的是,您似乎无法将多个对象放入 snmpget 函数中,例如:sysUpTime.0 ifInOctets.1 ifOutOctets.1。值得一提的是,如前所述,时间参数以纳秒为单位。关于这一点,有很多相互矛盾的信息。
javierb at gmx dot net
21 年前
池化 Cisco。

$ip = '1.1.1.1';
$community ='publico';
$a = snmpget($ip,$community, "IF-MIB::ifLastChange.1")
$b = snmpget($ip,$community, "IF-MIB::ifAlias.1");
print("a = ".$a."\n"."b = ".$b."\n");

a = Timeticks: (929969969) 107 days, 15:14:59.69
b = Timeticks: (929969969) 107 days, 15:14:59.69

当接口没有描述时。
tkjode at phalnet dot com
22 年前
在 NT/2000 系统上,人们已经观察到,用 SNMP 请求泛洪设备会导致 NT 的 SNMP 服务停止工作。

例如,我成功地轮询了网络上的 183 个交换机。然后,我尝试通过刷新和断开连接来模拟该页面的繁重流量(任何实际系统都必须经历)。SNMP 在整个机器上停止工作,包括非 PHP/Webserver 进程。
grice at berbee dot com
23 年前
看起来你可以使用非标准端口来运行 SNMP
像这样

$foo = snmpwalk('foo.bar.com:1161', 'foofoo', '.1.3.6');

这是在 PHP 3.16 上;我还没有成功地在 Solaris 2.6 上编译 PHP 4.02。
--Michael
brunoseys at telenet dot be
16 年前
根据 SNMPv2-MIB DEFINITIONS,正确语法应该是 "system.sysContact.0",而不是上面示例 2251 中使用的 "system.SysContact.0"。

SNMPv2-MIB DEFINITIONS
...
sysContact OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"此
托管节点的联系人姓名,以及如何联系该
人的信息。如果不知道任何联系信息,则该

是零长度字符串。"
::= { system 4 }
dstjohn-NO-SPAM at mediacast1 dot com
20 年前
snmpget 函数的小技巧

<?php
//snmpget 系统统计信息
$host = 'localhost';
$community = 'public';

//获取系统名称
$sysname = snmpget($host, $community, "system.sysName.0");

//获取系统正常运行时间
$sysup = snmpget($host, $community, "system.sysUpTime.0");
$sysupre = eregi_replace("([0-9]{3})","",$sysup);
$sysupre2 = eregi_replace("Timeticks:","",$sysupre);
$sysupre3 = eregi_replace("[()]","",$sysupre2);

//获取 TCP 连接
$tcpcon = snmpget($host, $community,"tcp.tcpCurrEstab.0");
$tcpconre = eregi_replace("Gauge32:","",$tcpcon);

echo
'<br>系统名称: '.$sysname.'<br><br>系统正常运行时间: '.$sysupre3.'<br><br>当前 TCP 连接: '.$tcpconre.'<br>';

?>
tridman
17 年前
超时以微秒为单位。因此 1.000.000 表示 1 秒。
Malaka Udawatta (malaka13 at gmail dot com)
16 年前
当我尝试使用 snmpget 函数获取 64 位计数器变量(例如 ifHCInOctets)时,出现以下错误消息。

数据包错误: (noSuchName) 此 MIB 中不存在此变量名称

解决方法是使用 snmp2_get();函数。参数与 snmpget();相同。
dstjohn-NO-SPAM at mediacast1 dot com
18 年前
两年小技巧更新 :)

<?php
// 作者:dstjohn at mediacast1.com
// 更新日期:2005-09-11
// 设置一些变量
$snmpcommunity = 'PUBLIC'; //snmp community 名称
$ips = 'test1.com,test2.com'; //要从中获取 SNMP 数据的 IP 或 DNS
$system_number = '1';
//结束变量

//开始循环
for ($i = 0; $i <= $system_number; $i++) {
$sysip = explode(",",$ips);

//获取系统名称
$sysname[0] = snmpget($sysip[$i], $snmpcommunity, "sysName.0");
$sysname[1] = eregi_replace("STRING:","",$sysname[0]);
echo
'系统名称: '.$sysname[1].'<br>';

//系统描述
$sysdesc[0] = snmpget($sysip[$i], $snmpcommunity, "sysDescr.0");
$sysdesc[1] = eregi_replace("STRING:","",$sysdesc[0]);
echo
'系统描述: '.$sysdesc[1].'<br>';

//系统位置
$sysloc[0] = snmpget($sysip[$i], $snmpcommunity, "sysLocation.0");
$sysloc[1] = eregi_replace("STRING:","",$sysloc[0]);
echo
'系统位置: '.$sysloc[1].'<br>';

//当前 TCP 连接
$tcpcons[0] = snmpget($sysip[$i], $snmpcommunity, "tcpCurrEstab.0");
$tcpcons[1] = eregi_replace("Gauge32:","",$tcpcons[0]);
echo
'打开的 TCP/IP 连接: '.$tcpcons[1].'<br>';

//获取系统正常运行时间
$sysuptime[0] = snmpget($sysip[$i], $snmpcommunity, "system.sysUpTime.0");
$sysuptime[1] = eregi_replace("Timeticks:","",$sysuptime[0]);
echo
'系统正常运行时间: Timeticks -'.$sysuptime[1].'<br>';

//仅限 Windows
//已安装内存
if(eregi('Windows',$sysdesc[1])){
$mem[0] = snmpget($sysip[$i], $snmpcommunity, "HOST-RESOURCES-MIB::hrMemorySize.0");
$mem[1] = eregi_replace("INTEGER:","",$mem[0]);
$mem[2] = eregi_replace("KBytes","",$mem[1]);
echo
'已安装内存: '.$mem[2].' 千字节<br>';
}

echo
'<br><br>';
}
//结束循环

?>
fbleau
18 年前
超时的默认值为 1000000 纳秒(1 秒),而检索值为 5,此值由 Net-SNMP 库设置。

#!/usr/local/bin/php
<?php
$time_start
= microtime(true);
$reponse = snmpget('10.5.1.1', 'public', "1.3.6.1.2.1.1.3.0",1000000,5);
$time_end = microtime(true);
$time = $time_end - $time_start;

echo
"延迟 $time 秒\n";
?>
To Top