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

如何直接从终端获取字符串的MD5哈希值?
例如,我想要对字符串abcdefg进行哈希。目前md5sum命令只接受文件名作为输入。我希望能够简单地输入以下命令行并完成所有操作。
md5sum abcdefg
output: ac54bcf346e578feb46888b3ecd2344f

怎样才能实现这个目标?

7md5 -s abcdefg - raitisd
TA=$(echo 40483760ff0a3649 | tr '.' ' ');for c in $TESTDATA; do echo $c | xxd -r; done - Sergio Abreu
9个回答

你也可以这样说:
~$ echo -n Welcome | md5sum
83218ac34c1834c26781fe4bde918ee4  -

它基本上做的事情与@enzotib所描述的一样,但可能更简单一些。

2你还想更新示例结果,因为7803ffca...是添加了换行符的结果。上述命令的正确结果是83218ac34c1834c26781fe4bde918ee4 - - Xanthir
32为什么末尾有空格和破折号? - keune
4如果我错了,请纠正我,但我认为这是因为MD5sum被应用于数据流,而不是读取与之关联的文件内容。 - jfmessier
28请注意,-n 是必需的。如果没有它,你的哈希值将完全错误,因为它包含了换行符。 - Pithikos
这个命令在 macOS 上也适用,不过略有不同:echo -n Welcome | md5 - Edward J. Stembler
2我怎么能忽略末尾的“-”呢?@jfmessier - alper
9@alper echo -n Welcome | md5sum | awk '{print $1}' 将提取以空格分隔的第一个“列”。你也可以使用 cut - domdambrogia
在Mac OS上,将md5sum替换为md5 - yannis
1令人不寻常的是,stdin与args有稍微不同的行为。作为参数时,它会检查文件是否存在。而对于stdin来说则不会。 - Sridhar Sarnobat

非常简单,它接受标准输入(stdin)。
md5sum <<<"my string"

为了避免Shell添加的尾随换行符:
printf '%s' "my string" | md5sum

给@messier和@enzotib都投一票;他们都属于我珍贵的“优雅简洁”类别。在脚本中,我会倾向于使用<<<"管道;在命令行中,echo string胜出。干得好。 - Tom
8+1 是用 printf 正确的使用方法。如果你想要得到没有 - 的总和,可以使用 | cut -d ' ' -f 1。示例用法:sum=$(printf '%s' 'some string' | md5sum | cut -d ' ' -f 1) - Lekensteyn
1虽然很奇怪,但是<<<运算符和printf函数对于md5哈希的结果完全不同!不过,printf的结果是正确的! - 2hamed
2似乎使用<<<运算符会向md5sum发送一个换行符! - 2hamed
1是的,正如我之前在第一个和第二个例子之间所说的那样。 - enzotib
1我在第一个命令b9bfa87a6a126911f2246c7a615bff27 -中得到了错误的结果,而不是2ba81a47c5512d9e23c435c1f29373cb - - Salem F

$ 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
3awk的替代方法:cut -d ' ' -f 1 - phil294
2我在.bashrc中创建了一个函数md5() { echo -n $1 | md5sum | awk '{print $1}'; },然后我可以在命令行中使用$ md5 test。谢谢答案。 - Ruben Benjamin
更短的 awk 命令:'$0=$1' - Alex Stragies
@AlexStragies 是的 - ty4z2008
@GuchoCa 或许会比较冗长,但他已经帮你完成了工作。只需创建一个脚本文件并执行即可! - Macindows

openssl md5 filename
openssl sha1 filename

使用 echo 将字符串管道化为内容

echo -n 123456 | openssl md5

在终端运行md5sum而没有添加任何参数会导致程序从终端读取输入。输入任何内容,完成后按ctrl-d结束输入。

4是的,你也是对的。但是要按两次ctrl+d才能起作用。 - 2hamed
@詹姆斯,如果不跟随换行符,则是的。如果你在按下回车后再按一次,它只需要一次。当它不跟随换行符时,它会强制立即处理到目前为止在该行上键入的所有字符,而不是等待换行符。 - psusi

我的快速尝试使用--help命令查看md5sum的说明,证明了以下命令的功能:
md5sum -

然后会提示您进行简单输入。输入一些文本,然后使用Enter,然后使用Ctrl+D表示文件结束,这将导致md5sum输出您输入的原始文本的MD5值(包括那个Enter,如果我没记错的话,它是一个CR)。
打字更少,无需使用管道!避免在shell历史记录中记录明文密码!太棒了!
如果您不想要那个尾随的CR(通常情况下,如果您想要哈希密码),在按下Enter之前,请连续按两次Ctrl+D

有很多例子可以做到这一点,但其中一些并不等价,因为其中一些明确或隐含地包括换行符,而其他一些则没有。

我想清楚地指定哪些流行方法包括换行符,哪些不包括。

以下是一些示例,计算md5哈希值时不包括尾随换行符(正确):

使用文本文件:

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

注意:在echo中的-n表示“不输出尾随换行符”。
使用带有-n的内联echo:
$ 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

使用不带-n选项的echo内联命令:
echo "test" | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -

使用here strings
$ md5sum <<< "test"
d8e8fca2dc0f896fd7cb4cb0031ba249  -

只使用 md5sum 命令,但在写入文本后按下Enter键:

(我们先写入md5sum,然后按下Enter键,再输入字符串test,然后再次按下Enter键,最后组合按下Ctrl+d

$ md5sum
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

使用md5sum -命令,但在写入文本后使用Enter键:
(我们先输入md5sum -,按下Enter键,然后输入字符串test,再按一次Enter键,最后组合使用Ctrl+d
$ md5sum -
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

在我的脚本中,我发现有两件事情你应该了解这个问题。
无论您使用`echo "$myvariable"`还是`echo -n "$myvariable"`都没关系,但对于字符串,您应该始终使用双引号,并且始终使用相同的方法。如果不这样做,就无法匹配。
在输出中,您总会得到一个末尾的空格和一个破折号,如示例所示: $ echo -n Welcome | md5sum 7803ffcaea43bb81a439fde13b29bc35 -
要摆脱那个并只保留代码 7803ffcaea43bb81a439fde13b29bc35,请执行以下操作:echo "$myvariable" | md5sum | cut -d" " -f1

1在这里不要忘记使用-n参数,以避免输出末尾的换行符,否则会导致错误的md5值:echo -n $myvariable | md5sum | cut -d" " -f1 - derFunk

对于我的情况,将一个普通字符串进行哈希处理的最佳解决方案是:
md5hash=$(echo -n "myhashedstring" | md5sum | head -c 32)

将会导致 2e8f8b94e488a2f442a55951862612aa 的结果。