snmpset 是 SNMP (Simple Network Management Protocol) 工具集中的一个核心命令,用于设置(Set)远程网络设备(如路由器、交换机、服务器、打印机等)上的管理信息库 对象的值。

如果你想通过命令行远程修改一个支持 SNMP 的设备的某个配置参数,snmpset 就是你要使用的工具。
snmpset 的基本语法
snmpset [OPTIONS] AGENT OID [TYPE] VALUE [OID [TYPE] VALUE]...
参数分解:
OPTIONS: 命令的选项,用于指定 SNMP 版本、认证信息、端口等。AGENT: 目标设备的地址,可以是:- 主机名 (
router.local) - IPv4 地址 (
168.1.1) - IPv6 地址 (
fe80::1) - 可以加上端口号 (
168.1.1:161)
- 主机名 (
OID(Object Identifier): 管理信息库对象的唯一标识符,这是你想要修改的参数。sysContact.0、ifInOctets.1。TYPE: 你要设置的值的数据类型,这是snmpset的关键部分,因为它告诉代理如何解释你提供的VALUE,常见的类型有:i: INTEGER (整数)u: unsigned INTEGER (无符号整数)s: OCTET STRING (八位字节串,通常用于字符串)x: HEX STRING (十六进制字符串)d: DECIMAL STRING (十进制字符串)o: OBJECT IDENTIFIER (对象标识符)t: Timeticks (时间刻度,用于表示时间差)a: IPADDRESS (IP 地址)b: BOOLEAN (布尔值,true或false)n: Counter64 (64位计数器)
VALUE: 你要为该 OID 设置的新值。
常用选项
为了成功执行 snmpset,你必须提供正确的认证信息,这通常通过以下选项实现:
| 选项 | 描述 | 示例 |
|---|---|---|
-v 2c |
指定使用 SNMPv2c 协议,这是最常用的版本,基于“社区字符串”进行认证。 | -v 2c |
-v 3 |
指定使用 SNMPv3 协议,这是最安全的版本,支持用户名、认证和加密。 | -v 3 |
-c <community> |
(v2c) 指定社区字符串。public 是只读的,private 通常是读写。 |
-c private |
-u <user> |
(v3) 指定 SNMPv3 用户名。 | -u admin |
-a <authproto> |
(v3) 指定认证协议,通常是 MD5 或 SHA。SHA 更安全。 |
-a SHA |
-A <authpass> |
(v3) 指定认证密码。 | -A MySecretAuthPass |
-x <privproto> |
(v3) 指定加密协议,通常是 DES 或 AES。AES 更安全。 |
-x AES |
-X <privpass> |
(v3) 指定加密密码。 | -X MySecretPrivPass |
-l <level> |
(v3) 指定安全级别。noAuthNoPriv (无认证无加密), authNoPriv (有认证无加密), authPriv (有认证有加密)。 |
-l authPriv |
-p <port> |
指定目标设备的 SNMP 端口,默认为 161。 |
-p 161 |
-Cw |
在写入前执行一个 check-and-set 操作,先读取旧值再写入新值,可以防止覆盖。 |
-Cw |
使用示例
示例 1: SNMPv2c - 设置系统联系人 (最简单)
假设我们要将一台路由器的系统联系人设置为 "John Doe"。
- 确定 OID: 系统联系人的 OID 是
sysContact.0(在SNMPv2-MIB中)。 - 确定数据类型: 联系人是字符串,所以类型是
s。 - 确定社区字符串: 假设我们使用读写社区字符串
private。
命令:

snmpset -v 2c -c private 192.168.1.1 sysContact.0 s "John Doe"
解释:
-v 2c: 使用 SNMPv2c 协议。-c private: 使用private作为读写社区字符串。168.1.1: 目标路由器的 IP 地址。sysContact.0: 要修改的 OID。s: 数据类型是字符串。"John Doe": 要设置的新值。
如果成功,你会看到类似 SNMPv2-MIB::sysContact.0 = STRING: "John Doe" 的返回。
示例 2: SNMPv2c - 启用一个网络接口
假设我们要启用目标设备的第 2 个网络接口 (索引为 2)。
- 确定 OID: 接口状态的 OID 是
ifAdminStatus,要启用索引为 2 的接口,OIDifAdminStatus.2。 - 确定数据类型:
ifAdminStatus是一个 INTEGER,类型是i。 - 确定值:
1表示up(启用),2表示down(禁用)。
命令:

snmpset -v 2c -c private 192.168.1.1 ifAdminStatus.2 i 1
解释:
ifAdminStatus.2: 修改第 2 个接口的管理状态。i: 数据类型是整数。1: 将状态设置为up。
示例 3: SNMPv3 - 安全地设置系统名称
SNMPv3 更安全,因为它不使用明文的社区字符串。
假设我们有一个配置好的 SNMPv3 用户 admin,使用 SHA 认证和 AES 加密。
命令:
snmpset -v 3 -u admin -l authPriv -a SHA -A "MyAuthPassword" -x AES -X "MyPrivPassword" 192.168.1.1 sysName.0 s "Core-Switch-01"
解释:
-v 3: 使用 SNMPv3 协议。-u admin: 用户名是admin。-l authPriv: 安全级别为“认证和加密”。-a SHA: 认证协议是 SHA。-A "MyAuthPassword": 认证密码。-x AES: 加密协议是 AES。-X "MyPrivPassword": 加密密码。sysName.0 s "Core-Switch-01": 将系统名称更改为 "Core-Switch-01"。
重要注意事项
-
风险性:
snmpset是一个非常强大的工具,可以严重破坏网络设备的配置,在生产环境中使用前,请务必:- 在测试环境中充分验证。
- 了解你要修改的 OID 的确切作用。
- 确保你有设备的备份配置。
- 最好在维护窗口期间执行。
-
权限: 你使用的社区字符串 (v2c) 或用户名 (v3) 必须具有写入 (write) 权限,如果只有只读权限,命令会失败并提示类似
not-writable的错误。 -
OID 的正确性: 错误的 OID 可能导致设置到错误的参数上,引发意想不到的问题,在设置前,先用
snmpget或snmpwalk确认一下 OID 是否存在且值是否正确。 -
值的有效性: 你设置的值必须符合该 OID 定义的数据类型和取值范围,你不能将一个字符串设置给一个期望整数的 OID。
-
防火墙: 确保目标设备的防火墙允许来自你管理主机的 UDP 流量(默认端口是
161),对于 SNMPv3 的通知,还可能需要允许162端口。
snmpset 是网络自动化和设备管理中不可或缺的命令,虽然功能强大且风险并存,但只要掌握了正确的语法、选项和安全实践,它就能极大地简化你的网络管理工作,从简单的 SNMPv2c 开始,逐步过渡到更安全的 SNMPv3,是推荐的学习路径。
