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

如何在Bash脚本中提取SNMPv3 EngineID的十六进制字符串

提取SNMPv3 EngineID完整十六进制字符串的解决方案

问题原因

你之前的代码只得到单个"80",是因为eval x=($ID)将命令输出按空格全部分割成了数组,${x[3]}仅对应第一个十六进制字段,后续的十六进制字符都在数组的后续元素中,所以无法获取完整字符串。

几种可行的实现方式

方法1:使用awk直接截取(推荐)

利用awk替换掉输出中Hex-STRING: 之前的所有内容,直接得到完整十六进制字符串:

snmp_result=$(snmpget -v3 -l authPriv -u jasmin -a SHA -A MyAuthPhrase -x AES -X MyPrivPhrase "$myIP" SNMP-FRAMEWORK-MIB::snmpEngineID.0)
engine_id=$(echo "$snmp_result" | awk '{sub(/.*Hex-STRING: /, ""); print}')
echo "完整EngineID: $engine_id"

方法2:使用cut命令分割字段

通过指定空格为分隔符,提取从第4个字段开始到末尾的所有内容:

engine_id=$(snmpget -v3 -l authPriv -u jasmin -a SHA -A MyAuthPhrase -x AES -X MyPrivPhrase "$myIP" SNMP-FRAMEWORK-MIB::snmpEngineID.0 | cut -d' ' -f4-)
echo "完整EngineID: $engine_id"

方法3:使用sed正则替换

用sed匹配并删除Hex-STRING: 之前的部分:

engine_id=$(snmpget -v3 -l authPriv -u jasmin -a SHA -A MyAuthPhrase -x AES -X MyPrivPhrase "$myIP" SNMP-FRAMEWORK-MIB::snmpEngineID.0 | sed 's/.*Hex-STRING: //')
echo "完整EngineID: $engine_id"

方法4:修正你原有的数组方式(不推荐)

如果坚持用数组方式,需要遍历从第3个索引开始的所有元素并拼接:

ID=$(snmpget -v3 -l authPriv -u jasmin -a SHA -A MyAuthPhrase -x AES -X MyPrivPhrase "$myIP" SNMP-FRAMEWORK-MIB::snmpEngineID.0)
eval x=($ID)
engine_id=""
for ((i=3; i<${#x[@]}; i++)); do
  engine_id+="${x[i]} "
done
# 去掉末尾多余空格
engine_id=$(echo "$engine_id" | sed 's/ $//')
echo "完整EngineID: $engine_id"

批量处理建议

针对16000台设备的场景,建议搭配xargs或parallel工具实现并行查询,提升效率,比如:

# 假设设备IP列表存放在ip_list.txt中
cat ip_list.txt | xargs -P 10 -I {} sh -c '
  engine_id=$(snmpget -v3 -l authPriv -u jasmin -a SHA -A MyAuthPhrase -x AES -X MyPrivPhrase {} SNMP-FRAMEWORK-MIB::snmpEngineID.0 | awk "{sub(/.*Hex-STRING: /, \"\"); print}")
  echo "{}: $engine_id" >> engine_ids.txt
'

其中-P 10表示同时启动10个并行进程,可根据服务器性能调整数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:15:20