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
相关产品推荐
相关产品推荐

