如何直接在终端中获取字符串的MD5哈希?


189

如何直接从终端获取字符串的MD5哈希?

例如,我要对字符串进行abcdefg哈希处理。当前,md5sum命令仅接受文件名作为输入。我只想输入以下行即可完成所有操作。

md5sum abcdefg
output: ac54bcf346e578feb46888b3ecd2344f

我该如何实现?


2
md5 -s abcdefg
激怒

Answers:


252

您也可以这样说:

~$ echo -n Welcome | md5sum
83218ac34c1834c26781fe4bde918ee4  -

它基本上执行与@enzotib描述的相同的操作,但可能会更简单。


2
你也想更新的例子结果,7803ffca ...是结果添加的换行符。上面命令的正确结果是83218ac34c1834c26781fe4bde918ee4 -
Xanthir

19
为什么末尾有空格和破折号?
keune

1
如果我错了,请纠正我,但是我认为这是因为MD5sum应用于数据流,而不是读取具有相关名称的文件内容。
jfmessier 2015年

11
请注意,-n是必填项。没有它,您的哈希将完全错误,因为它包含换行符。
皮蒂科斯

1
最后我怎么能忽略-。@jfmessier
alper

61

很简单,它接受标准输入,所以

md5sum <<<"my string"

为了避免外壳程序添加尾随换行符:

printf '%s' "my string" | md5sum

给@messier和@enzotib投票;两者都属于我的“优雅简洁”类别。我倾向于<<<"在脚本中使用管道;echo string赢得命令行。做得好。
汤姆(Tom)

3
+1表示printf正确使用。如果您想获得不带的总和-,请输入| cut -d ' ' -f 1。用法示例:sum=$(printf '%s' 'some string' | md5sum | cut -d ' ' -f 1)
Lekensteyn 2011年

1
很奇怪,但是<<<运算符和printf函数为md5哈希给出了完全不同的结果!printf的结果是正确的!
Hamed Momeni

看来使用<<<运算符会向md5sum发送换行符!
Hamed Momeni

1
是的,确实如此,正如我在第一个示例和第二个示例之间所说的那样
enzotib

27
$ echo -n 123456 | md5sum | awk '{print $1}'
e10adc3949ba59abbe56e057f20f883e

您可以创建一个shell脚本。

例如,脚本名称是md5.sh:

#!/bin/bash

echo   -n   $1 | md5sum | awk '{print $1}'

权限执行:

 chmod +x md5.sh

然后:

$ md5.sh 123456
e10adc3949ba59abbe56e057f20f883e

如果您的系统是macOS。您需要修改此脚本:

$ echo -n 123456 | md5 | awk '{print $1}' 
e10adc3949ba59abbe56e057f20f883e

1
这太长了。
Gucho Ca

1
替代awk:cut -d ' ' -f 1
Blauhirn

md5() { echo -n $1 | md5sum | awk '{print $1}'; }在.bashrc中创建了一个函数,然后可以$ md5 test在命令行中使用。感谢您的回答
鲁本·本杰明

较短的awk命令:'$0=$1'
Alex Stragies

@AlexStragies是
ty4z2008

10

运行不带任何参数的md5sum会使它从终端读取输入。输入或粘贴所需的任何内容,完成后,按ctrl-d结束输入。


1
是的,你也是对的。但ctrl+d需要按两次才能正常工作。
Hamed Momeni

@James,如果不跟随换行符,则可以。如果您在按Enter键后将其击中,则只需一次。当它不跟随换行符时,它仅强制到目前为止到目前为止在该行上键入的所有字符,而不是等待换行符。
psusi 2011年

10
openssl md5 filename
openssl sha1 filename

对于字符串管道,使用echo的内容

echo -n 123456 | openssl md5

4

我快速浏览一下--helpfor md5sum演示了该命令:

md5sum -

然后会提示您进行简单的输入。输入一些文字,然后使用Enter,然后Ctrl+ D来表示文件的末尾,则使md5sum吐出你输入(包括原始文本的MD5 Enter,这是一个CR,IIRC)。

更少的打字,没有管道!并避免将您的明文密码记录在shell历史记录中!!

如果您不希望该末尾CR(通常是要散列密码的情况),请不要EnterCtrl+ 之前打D,而应输入Ctrl+ D两次。


2

在我的脚本中,我发现关于此问题,您应该了解两件事。

  • 如果你不要紧,echo "$myvariable"或者echo -n "$myvariable" ,但你应该总是使用doubleqoutes字符串,总是使用同样的方法。如果不是这样,事情就不会匹配。
  • 在输出中,您总是得到一个尾随空格和破折号,如示例所示:

    $ echo -n Welcome | md5sum
    7803ffcaea43bb81a439fde13b29bc35  -
    

要摆脱这种情况,只保留代码7803ffcaea43bb81a439fde13b29bc35,请执行以下操作:echo "$myvariable" | md5sum | cut -d" " -f1


不要忘了-n这里的参数,以避免输出结尾的换行符,这会导致错误的md5:echo -n $myvariable | md5sum | cut -d" " -f1
derFunk 2015年

1

有许多示例可以执行此操作,但是其中一些示例并不等效,因为其中一些显式或隐式包含换行符,而另一些则不然。

我想明确指出哪些流行的方法包括换行符,哪些不包括。

以下是一些计算md5哈希值而无尾随换行符(CORRECT)的示例:

使用带有文本的文件:

$ echo -n "test" > test.txt
$ wc test.txt
0 1 4 test.txt
$ md5sum test.txt
098f6bcd4621d373cade4e832627b4f6  test.txt

注意: -n in echo表示:“不输出结尾的换行符”。

echo-n内联一起使用:

$ echo -n "test" | md5sum
098f6bcd4621d373cade4e832627b4f6  -

使用printf

$ printf "%s" "test" | md5sum
098f6bcd4621d373cade4e832627b4f6  -

仅使用md5sum命令:

(让我们写md5sum,按Enter然后写字符串test,然后按双组合Ctrl+ d

$ md5sum
test098f6bcd4621d373cade4e832627b4f6  -

使用md5sum -命令:

(让我们写md5sum -,按Enter然后写字符串test,然后按双组合Ctrl+ d

$ md5sum -
test098f6bcd4621d373cade4e832627b4f6  -

以下是一些使用尾随换行符来计算md5哈希的示例(很不正确):

使用带有文本的文件:

$ echo "test" > test_n.txt
$ wc test_n.txt
1 1 5 test_n.txt
$ md5sum test_n.txt
d8e8fca2dc0f896fd7cb4cb0031ba249  test_n.txt

内联使用echoWITHOUT -n

echo "test" | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -

在这里使用字符串

$ md5sum <<< "test"
d8e8fca2dc0f896fd7cb4cb0031ba249  -

编写文本后,仅使用md5sum命令但使用Enterkey:

(让我们写md5sum,按Enter然后写字符串test,然后按agaien Enter和一次组合Ctrl+ d

$ md5sum
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

编写文本后,使用md5sum -命令但使用Enter键:

(让我们写md5sum -,按Enter然后写字符串test,然后按agaien Enter和一次组合Ctrl+ d

$ md5sum -
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.