Powershell SNMP 转换 IP 地址:获取错误值
Powershell SNMP converting IP Address: Getting wrong value
如何正确地将通过 OleSNMP 获得的 IP 地址转换为可用值?
我正在尝试编写一个 Powershell 脚本来使用 SNMP 查询设备,然后显示数据。 Stuff 适用于简单类型,但我在 IP 地址(和 MAC 地址,但现在让我们坚持使用 IP)方面遇到问题
这是我的(简化为问题space):
param ($ipaddr='10.1.128.114', $community='Public')
$snmp = New-Object -ComObject oleprn.OleSNMP
$snmp.open($ipaddr, $community)
$result = $snmp.get(".1.3.6.1.2.1.4.20.1.1.10.1.128.114")
$enc = [system.Text.Encoding]::ASCII
$bytes = $enc.GetBytes($result)
write-host( "bytes:" + $bytes)
输出:
bytes:10 1 63 114
如我所料
bytes:10 1 128 114
相比之下,snmp-get 输出:
$ snmpget 10.1.128.114 -c Public -v2c -On .1.3.6.1.2.1.4.20.1.1.10.1.128.114
.1.3.6.1.2.1.4.20.1.1.10.1.128.114 = IpAddress: 10.1.128.114
是的,我意识到在我的最终脚本中我将不得不走 table 而不是使用直接的“get”,但我需要先修复我的解析。
如评论中所述,ASCII编码将其有效范围之外的字符替换为问号?
,即ASCII字符63。
有关 ASCIIEncoding.GetBytes 的文档中提供了更多信息 - 搜索“?”你会发现:
ASCIIEncoding does not provide error detection. Any Unicode character greater than U+007F is encoded as the ASCII question mark ("?").
请注意,0x7F 是 127,因此由于 [char] 128
超出此范围,因此当您调用 GetBytes
.
您的代码基本上是这样做的:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::ASCII
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 63 (i.e. "?")
# 114
您需要使用编码器将高于 0x7F 的字符转换为等效字节 - iso-8859-1 之类的东西似乎可以工作:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 128
# 114
如何正确地将通过 OleSNMP 获得的 IP 地址转换为可用值?
我正在尝试编写一个 Powershell 脚本来使用 SNMP 查询设备,然后显示数据。 Stuff 适用于简单类型,但我在 IP 地址(和 MAC 地址,但现在让我们坚持使用 IP)方面遇到问题
这是我的(简化为问题space):
param ($ipaddr='10.1.128.114', $community='Public')
$snmp = New-Object -ComObject oleprn.OleSNMP
$snmp.open($ipaddr, $community)
$result = $snmp.get(".1.3.6.1.2.1.4.20.1.1.10.1.128.114")
$enc = [system.Text.Encoding]::ASCII
$bytes = $enc.GetBytes($result)
write-host( "bytes:" + $bytes)
输出:
bytes:10 1 63 114
如我所料
bytes:10 1 128 114
相比之下,snmp-get 输出:
$ snmpget 10.1.128.114 -c Public -v2c -On .1.3.6.1.2.1.4.20.1.1.10.1.128.114
.1.3.6.1.2.1.4.20.1.1.10.1.128.114 = IpAddress: 10.1.128.114
是的,我意识到在我的最终脚本中我将不得不走 table 而不是使用直接的“get”,但我需要先修复我的解析。
如评论中所述,ASCII编码将其有效范围之外的字符替换为问号?
,即ASCII字符63。
有关 ASCIIEncoding.GetBytes 的文档中提供了更多信息 - 搜索“?”你会发现:
ASCIIEncoding does not provide error detection. Any Unicode character greater than U+007F is encoded as the ASCII question mark ("?").
请注意,0x7F 是 127,因此由于 [char] 128
超出此范围,因此当您调用 GetBytes
.
您的代码基本上是这样做的:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::ASCII
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 63 (i.e. "?")
# 114
您需要使用编码器将高于 0x7F 的字符转换为等效字节 - iso-8859-1 之类的东西似乎可以工作:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 128
# 114