解析带有空格的十六进制值,最后两个字符被删除

问题描述 投票:0回答:1

我有一个从设备获取 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 个服务器上,但这是另一个兔子洞)。

如何修复读取命令以便捕获整个十六进制?

shell snmp
1个回答
0
投票

您的 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
© www.soinside.com 2019 - 2024. All rights reserved.