我有一个从设备获取 snmpv3 引擎ID 的脚本。 它在我的开发服务器和 uat 服务器上都运行良好。我通过创建所有 snmp 配置文件(包括脚本)的 tar 文件,将代码从一个服务器移动到下一个服务器,并将 tar 提取到下一台服务器并回收服务。在每一个上,snmpv3 陷阱都会写入日志文件。 昨天我将其投入生产,并且没有记录任何陷阱。 在诊断过程中,我注意到我的 snmpget 命令删除了十六进制字符串的最后两位数字。
我的代码:
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。(这让我想知道为什么陷阱会记录在其他 3 个服务器上,但这是另一个兔子洞)。
如何修复读取命令以便捕获整个十六进制?
您的 snmpget 输出两行,第二行为 39,但 shell
read
读取一行。我注意到大部分值都可以解释为 ASCII 'SN-532045729',它看起来像一个序列号;如果是这样,也许 3 个工作服务器的序列号至少短一位数字,以便它们适合第一行。
在 bash 或 zsh 中,您可以使用
read -d '' ...
读取两行(或通常是多行),随后的 echo $hex
(不带引号!)将有效地将换行符转换为空格(具体来说,将不带引号的 $hex 扩展为单独的任何 IFS 字符处的参数默认包含空格制表符或换行符,然后 echo
将其参数与空格重新连接在一起)。虽然在 bash 或 zsh 中你根本不需要 echo-plus-sed,只需使用 ${hex//[[:space:]]}
dash 给出了
-d
的错误,ksh93 接受它,但似乎忽略它(至少在我的 Ubuntu 中)。对于 POSIX shell,如果您的脚本此时不需要位置参数,您可以使用它们:
set -- $(snmpget ...) # breaks at IFS
shift 3 # $*/$@ now contains only the hex fields
IFS=""; # then use "$*" (in quotes to prevent resplitting) in place of $myhex