You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SNMPv3脚本解析Hex-STRING丢失最后两位字符的修复咨询

问题:SNMPv3 engineID获取时末尾字符被read命令丢弃

我有一个获取设备SNMPv3 engineID的脚本,在开发、UAT服务器上运行正常,迁移配置和脚本到新服务器后SNMPv3陷阱也能正常写入日志,但放到生产环境后陷阱不再记录。排查发现snmpget返回的十六进制字符串最后两位被read命令丢弃了。

原脚本代码

if test $snmpget_RC -eq 0
    then
        read dc1 dc2 dc3 hex < <(snmpget -v3 -l authPriv -u $UserName -a SHA -A mypassword -x AES -X myauthphrase $myIP SNMP-FRAMEWORK-MIB::snmpEngineID.0)
        MyHex=`echo $hex |sed 's/[[:blank:]]//g'`
        echo 'createUser -e' $MyHex  $UserName' SHA mypassword AES myauthphrase' >>$snmpPath/$MyFile
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') $myIP is not reachable" >> $myLog
        RC=0
fi

现象说明

  • CLI直接运行snmpget的返回结果:
SNMP-FRAMEWORK-MIB::snmpEngineID.0 = Hex-STRING: 80 00 92 C4 04 53 4E 2D 35 33 32 30 34 35 37 32

39
  • 交互运行脚本时输出的十六进制值:
Hex value for deviceFQDN is 00092C404534E2D3533323034353732

可以看到末尾的39未被read命令捕获。

修复方案

问题根源是read命令默认只读取第一行内容,且按空格分割字段,而snmpget返回的十六进制字符串末尾的39单独占了一行,导致被遗漏。以下两种方法可以解决:

方法1:直接提取并拼接完整内容

替换原read相关逻辑为:

if test $snmpget_RC -eq 0
    then
        # 提取Hex-STRING后的所有内容,去掉换行和空格
        MyHex=$(snmpget -v3 -l authPriv -u $UserName -a SHA -A mypassword -x AES -X myauthphrase $myIP SNMP-FRAMEWORK-MIB::snmpEngineID.0 | grep -oP '(?<=Hex-STRING: ).*' | tr -d '\n ')
        echo 'createUser -e' $MyHex  $UserName' SHA mypassword AES myauthphrase' >>$snmpPath/$MyFile
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') $myIP is not reachable" >> $myLog
        RC=0
fi
  • grep -oP '(?<=Hex-STRING: ).*':精准匹配并提取Hex-STRING:之后的所有内容
  • tr -d '\n ':移除所有换行符和空格,直接生成完整的十六进制字符串

方法2:保留原结构,合并多行内容

替换原read命令为:

if test $snmpget_RC -eq 0
    then
        # 将snmpget输出的换行转为空格,再读取拆分
        IFS=' ' read -r dc1 dc2 dc3 -a hex_parts < <(snmpget -v3 -l authPriv -u $UserName -a SHA -A mypassword -x AES -X myauthphrase $myIP SNMP-FRAMEWORK-MIB::snmpEngineID.0 | tr '\n' ' ')
        # 拼接数组内的所有十六进制片段
        MyHex=$(printf '%s' "${hex_parts[@]}")
        echo 'createUser -e' $MyHex  $UserName' SHA mypassword AES myauthphrase' >>$snmpPath/$MyFile
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') $myIP is not reachable" >> $myLog
        RC=0
fi
  • tr '\n' ' ':把snmpget输出中的换行符替换为空格,让所有十六进制内容处于同一行
  • read -r dc1 dc2 dc3 -a hex_parts:将前三个固定字段分配到变量,剩余所有十六进制片段存入数组
  • printf '%s' "${hex_parts[@]}":将数组内容拼接成完整无间隔的字符串

内容的提问来源于stack exchange,提问作者Rovernut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:04:56