首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell SNMP转换IP地址:获取错误值

Powershell SNMP转换IP地址:获取错误值
EN

Stack Overflow用户
提问于 2022-05-26 20:10:07
回答 1查看 160关注 0票数 1

如何正确地将通过OleSNMP获得的IP地址转换为可使用的值?

我试图编写一个Powershell脚本来使用SNMP查询设备,然后显示数据。对于简单类型来说,这些东西工作得很好,但是我的IP地址(和MAC地址)有问题,但我们现在还是坚持使用IP吧。

下面是我所做的(简化为问题空间):

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
$ 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

是的,我意识到在我的最后一个脚本中,我将不得不遍历表,而不是直接使用"get“,但是我需要首先修复我的解析。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 22:05:03

正如注释中提到的,ASCII编码用问号?替换其有效范围以外的字符,这是ASCII字符63。

更多信息可在ASCIIEncoding.GetBytes文档中找到--搜索"?“你会发现这个:

ASCIIEncoding不提供错误检测。任何大于U+007F的Unicode字符都被编码为ASCII问号("?")。

注意,0x7F是127,所以由于[char] 128超出了这个范围,所以当您调用GetBytes时,它将被转换为? (也就是63)的字节等效。

您的代码基本上就是这样做的:

代码语言:javascript
复制
$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这样的代码似乎有效:

代码语言:javascript
复制
$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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72397525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档