【问题标题】:BSD md5 vs GNU md5sum output format?BSD md5 vs GNU md5sum 输出格式?
【发布时间】:2009-08-19 13:11:34
【问题描述】:

任何人都知道为什么 BSD md5 程序会产生这种格式的哈希输出...

MD5 (checksum.md5) = 9eb7a54d24dbf6a2eb9f7ce7a1853cd0

...而 GNU md5sum 会生成这样更合理的格式?

9eb7a54d24dbf6a2eb9f7ce7a1853cd0 checksum.md5

据我所知,md5sum 格式更容易解析并且更有意义。你怎么用 md5 做md5sum -check? -p、-q、-r、-t、-x 选项是什么意思? man md5 对这些选项只字未提! :|

【问题讨论】:

  • 可能会发生 poweruser/serverfault 但并不真正属于这里。
  • ... 还是超级用户?我不记得了
  • md5 -r 会产生与md5sum 非常相似的东西(校验和,然后是文件名)。例如,find . -type f -print0 | xargs -0 md5 -r 列出了所有文件的 md5 校验和。
  • 前面MD5的用处可能是哈希算法可以从文件本身推导出来,而不是假设。考虑到9eb7a54d24dbf6a2eb9f7ce7a1853cd0 myfile.txt 并没有告诉你使用的哈希是什么。还要考虑由“纯文本”而不​​在其中任何地方包含文件编码所造成的完全混乱。通过包含散列算法,应该使用什么散列进行比较是明确的。 BSD 的格式对我来说似乎更合理。

标签: md5 gnu bsd


【解决方案1】:

在当前的 OS X BSD 系统上,您可以指定 md5 -r 命令来获得预期的输出。

sgwilbur@gura:/vms/DevOps-v3.4$ md5 vmware*
MD5 (vmware-0.log) = 61ba1d68a144023111539abee08f4044
MD5 (vmware-1.log) = 97bc6f22b25833c3eca2b2cc40b83ecf
MD5 (vmware-2.log) = f92a281102710c4528d4ceb88aa0ac9b
MD5 (vmware.log) = 1f7858d361929d4bc5739931a075c0ad

添加 md5 -r 开关使输出看起来更像我的预期,并且更容易与从 Linux 机器生成的 linux md5 和进行比较。

sgwilbur@gura:/vms/DevOps-v3.4$ md5 -r vmware*
61ba1d68a144023111539abee08f4044 vmware-0.log
97bc6f22b25833c3eca2b2cc40b83ecf vmware-1.log
f92a281102710c4528d4ceb88aa0ac9b vmware-2.log
1f7858d361929d4bc5739931a075c0ad vmware.log

这对我来说是最简单的方法,很容易与 Linux 机器上的 md5sum 命令生成的输出进行区分。

【讨论】:

    【解决方案2】:

    我猜是历史原因。同时, -q 抑制 "MD5(...) = " 输出,所以 md5 -q checksum.md5 给出

    9eb7a54d24dbf6a2eb9f7ce7a1853cd0

    如果 md5 没有给出任何参数并且它从标准输入读取,则这是隐含的。 不幸的是,在这种情况下,md5sum 在校验和后面留下了“-”(“9eb7a54d24dbf6a2eb9f7ce7a1853cd0 -”), 因此,如果您正在寻找一些通用函数来返回校验和,这可能会有所帮助:

    校验和(){ (md5sum

    FreeBSD 的手册页介绍了这些参数

     -p 将标准输入回显到标准输出并将校验和附加到标准输出。
    
    
     -q      Quiet mode ‐ only the checksum is printed out.  Overrides the -r
             option.
    
     -r      Reverses the format of the output.  This helps with visual diffs.
             Does nothing when combined with the -ptx options.
    
     -t      Run a built‐in time trial.
    
     -x      Run a built‐in test script.
    

    【讨论】:

    • 现在我习惯了“-q”,似乎没有 GNU 等价物
    【解决方案3】:

    我意识到这是一个旧页面,但我在 FreeBSD 上进行校验和在 Linux 上检查它们,我也遇到了这个页面。这个页面并没有帮助我解决问题,所以我想出了这个小 sed 脚本来在 FreeBSD 上创建与 Linux md5sum 输出匹配的校验和:

    md5 file [file ...] | sed -e 's#^MD5 [(]\(.*\)[)] = \(.*\)$#\2 \1#' > md5sums.txt
    

    这将使用 FreeBSD md5 命令并重新排列输出,使其看起来像 GNU md5sum

    然后在 Linux 上我可以使用 md5sum --check md5sums.txt

    您还可以将上述 sed 脚​​本与 FreeBSD 的 md5 命令生成的现有文件一起使用。

    我还将这个别名放在我的 FreeBSD .cshrc 文件中:

    alias md5sum "md5 \!* | sed -e '"'s#MD5 [(]\(.*\)[)] = \(.*\)$#\2 \1#'"'"
    

    现在在 FreeBSD 上我可以说 md5sum file1 file2 file3 ... 并且它可以正常工作。

    【讨论】:

    • sed 脚本给我的空间比 centos6 上的 GNU md5sum 少一个。 NBD,但是如果不稍微按摩一下,“差异”就无法工作。
    【解决方案4】:

    可以使用 GNU md5sum -c checksum.md5 查找 checksum 文件并检查 checksum.md5 文件内容。

    md5sum -c checksum.md5 | grep "checksum: OK" -

    在 Ruby 系统调用中检查 BSD 格式的 .md5 文件的示例:

    system("md5sum -c checksum.md5 | grep \"checksum: OK\" -")

    这将返回真或假。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多