【问题标题】:Convert Decimal to Hex and place a starting zero if the conversion results in a single hex letter (Bash)如果转换结果为单个十六进制字母 (Bash),则将十进制转换为十六进制并放置一个起始零
【发布时间】:2020-03-30 18:53:54
【问题描述】:

这是我的案例场景...

我正在编写一个 bash 脚本来验证我的所有 VPN 证书并检查它们是否已过期。 VPN 证书(.crt 文件)通常具有关联的私钥(.pem 文件)。这些 .crt 文件中写入了一个唯一的整数序列号,.pem 文件是根据该序列号到十六进制的转换来命名的。

例子:

  • 证书 john.crt 里面写有唯一的序列号,假设它是 44
  • 十六进制的 442C。因此,与 john.crt 关联的 .pem 文件将被命名为 2C.pem

要验证证书是否已过期,我使用以下命令:

openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/xx.pem

所以我需要知道证书中的序列号并将它们转换为十六进制以知道所有 .pem 文件的名称。

这是我的脚本:

#!/bin/bash

serial_numbers=(`cat /etc/openvpn/keys/my-organization/*.crt | grep "Serial Number" | awk '{print $3}'`)

for number in ${serial_numbers[*]}; do
    toHex=(`echo "obase=16; $number" | bc`)

    for item in ${toHex[*]}; do
        verify=(`openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/"$item".pem`)

        for line in ${verify[*]}; do
            echo $line
        done
    done
done

这可行,但对于某些人来说,我得到 没有这样的文件或目录... 某些序列号在转换为十六进制时会产生一个字母。在这种情况下,.pem 文件的名称应以 0(零)开头。

例子:

  • will.crt 的序列号为 15
  • 十六进制的 15F。因此,与 will.crt 关联的 .pem 文件应命名为 0F.pem

我怎样才能通过这个并使其适用于每种情况?

【问题讨论】:

  • 数组toHexverify 只包含一个元素,不是吗?
  • 不,serial_numbers 包含该文件夹中的所有 .crt 文件,因此每个数组中至少有 40 个元素!
  • 但是在for number in ${serial_numbers[*]} 之后,number 是一个标量,而赋值toHex=(`echo "obase=16; $number" | bc`) 导致toHex 只包含一个元素——可能是toHex=$(echo "obase=16; $number" | bc)
  • 不知道我错过了什么,但在这里有效!这个脚本在我的工作电脑里,明天我会检查并确认我是否在这里粘贴错了。

标签: bash openssl hex vpn openvpn


【解决方案1】:

您可以使用 printf 格式化:

$ printf '%02X\n' 15 44
0F
2C

%X 是带有大写字符的十六进制,02 是零填充,宽度至少为 2。

您可以替换此语句

toHex=(`echo "obase=16; $number" | bc`)

printf -v toHex '%02X' "$number"

【讨论】:

  • 谢谢@Benjamin!我设法弄清楚做类似的事情,但你的方式更好!
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多