【问题标题】:CGI output Shell - md5sum wrong valueCGI 输出 Shell - md5sum 错误值
【发布时间】:2020-05-13 09:19:42
【问题描述】:

我需要将 IPv4 地址拆分为八位字节,计算每个字节的 MD5 哈希并打印为 CGI 输出:

IP1=$(echo ${REMOTE_ADDR} | tr "." " " | awk '{print $1'} | md5sum | cut -c1-32)
printf $IP1

在本例中,REMOTE_ADDR = 192.168.20.100 但是 192 的 MD5 给了我一个错误的 MD5 IP1=6be7de648baa9067fa3087928d5ab0b4,而它应该是 58a2fc6ed39fd083f55d4182bf88826d

如果我这样做:

cat /tmp/test.txt | md5sum | cut -c1-32

其中test.txt 包含192, 我得到了正确的 MD5 哈希,即58a2fc6ed39fd083f55d4182bf88826d

我做错了什么?

【问题讨论】:

    标签: shell awk cgi md5sum


    【解决方案1】:

    您的awkprint 正在添加一个换行符,因此您计算的是"192\n" 的md5,而不是"192"。使用

    IP1=$(printf "%s" "${REMOTE_ADDR%.*.*.*}" | md5sum | cut -c1-32)
    

    相反,它使用 shell 参数扩展来删除除了 IP 地址的第一个八位字节之外的所有内容,并使用printf 来编写它而不使用换行符。

    【讨论】:

    • 谢谢,这是正确的!其他 3 个八位字节呢?如何应用相同的解析?
    • 如果您想分别对所有 4 个八位字节进行哈希处理,我可能会先使用 datamash:例如 tr . '\t' <<< "$REMOTE_ADDR" | datamash md5 1-4。或 perl one 班轮。
    【解决方案2】:

    正如@Shawn 所说,问题出在 awk 打印上。

    添加tr -d '\n' 解决了这个问题。

    现在它可以正常工作了;对于其他八位字节,我必须在 awk 上更改 print $2..etc

    IP1=$(echo ${REMOTE_ADDR} | awk -F. '{print $1'} | tr -d '\n' | md5sum | cut -c1-32 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2022-10-23
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多