【问题标题】:bash - hash binary contents of variable without creating a filebash - 散列变量的二进制内容而不创建文件
【发布时间】:2016-01-30 20:54:43
【问题描述】:

我正在尝试获取存储在从 curl 语句创建的变量中的内容的哈希值,而不将 curl 输出到文件中。

基本上我想避免:

curl website.com/file.exe >> tempfile.bin
md5sum tempfile.bin

以上提供了正确的 md5 哈希值。在测试纯文本文件时,我的方法(如下)似乎有效,但是当我尝试下载二进制文件并将其保存到变量时,哈希值与我将其保存到文件时不同。

我的尝试:

binary=$(curl website.com/file.exe)
echo $binary | md5sum

我想我可能错过了一个标志,或者 echo 可能不是最好的方法。这个挑战的重要部分不是将文件写入磁盘,而是实现与写入磁盘相同的 md5 哈希。

【问题讨论】:

  • echo -n 和引用变量有帮助吗?
  • 可悲的是 -n 和 -e 也没有组合工作。
  • @Onitsoga 你肯定不想要-e。你引用了变量吗?
  • @gniourf_gniourf 没用 :(
  • @Biffen 我有没有运气。

标签: linux bash curl hash md5sum


【解决方案1】:

要跳过使用临时变量的步骤,您可以使用进程替换:

md5sum <(curl website.com/file.exe)

或直接通过管道传递给md5sum

curl website.com/file.exe | md5sum

【讨论】:

  • 实际上不需要进程替换。 curl | md5sum 也可以(而且更便携)。
  • @gniourf_gniourf 已添加!
  • 这似乎工作得很好!哈哈,就这么简单!
  • 实际上我忘了提到我需要将二进制文件保存在变量中以备后用。所以我还需要依赖回声?
  • var=$(curl ...; echo x); var=${var%x}。命令替换将从命令输出中删除任何尾随换行符,因此您需要一个标记值以确保您不会丢失任何最终字节。
【解决方案2】:

正如您所经历的那样,bash shell 不能很好地处理原始二进制数据。为了实现您的目标,您需要在将文件内容读入 bash 变量时将它们编码为文本格式,并在写出它们时对其进行解码。

例如,如果您有 base64 工具,您可以使用它重新实现您的示例,如下所示:

encoded=$(curl website.com/file.exe | base64)
echo "$encoded" | base64 --decode | md5sum

如果您以后想将数据保存到名为 $output 的文件中,您可以这样做:

echo "$encoded" | base64 --decode -o "$output"

【讨论】:

  • 如果这行得通,这更符合我的需要。但是,当我运行它时,我收到错误“base64:无效输入”
  • 再试几次后,效果很好!谢谢!我不得不在引号中回显变量。所以对于我的例子:binary=$(curl website.com/file.exe | base64); echo "$binary" | base64 --decode | md5sum这给了我propper md5sum
  • 对不起!我已经更新了答案以包含引号。
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2011-12-11
  • 2020-08-03
相关资源
最近更新 更多