253

How do I get the MD5 hash of a string directly from the terminal?

For example, I want the string abcdefg hashed. Currently the md5sum command only accepts a filename as input. I want to simply enter the following line and everything be done with.

md5sum abcdefg
output: ac54bcf346e578feb46888b3ecd2344f

How can I achieve that?

2
  • 7
    md5 -s abcdefg
    – raitisd
    Feb 19, 2018 at 13:04
  • Don't know why this question is here on this forum. It should be on Unix & Linux, Super User, but here? I'm not sure. Anyway, it has value, wherever it should be.
    – ivanleoncz
    May 12, 2020 at 19:31

9 Answers 9

349

You can also say something like this :

~$ echo -n Welcome | md5sum
83218ac34c1834c26781fe4bde918ee4  -

It basically does the same thing as described by @enzotib, but is perhaps a bit simpler.

9
  • 2
    You also want to update the example result, as 7803ffca... is the result with the added newline. The correct result for the command above is 83218ac34c1834c26781fe4bde918ee4 -
    – Xanthir
    May 27, 2015 at 21:14
  • 28
    why are there spaces and a dash at the end?
    – keune
    Dec 2, 2015 at 9:46
  • 24
    Notice that the -n is mandatory. Without it, your hash will be totally wrong since it includes the newline character.
    – Pithikos
    Feb 8, 2016 at 11:23
  • 2
    How could I ignore - at the end. @jfmessier
    – alper
    May 31, 2018 at 13:04
  • 5
    @alper echo -n Welcome | md5sum | awk '{print $1}' will take the first "column" separated by spaces. You could also use cut as well. Nov 20, 2020 at 6:13
78

Very simple, it accepts stdin, so

md5sum <<<"my string"

To avoid the trailing newline added by the shell:

printf '%s' "my string" | md5sum
6
  • Giving both @messier and @enzotib a vote; both fall in my prized "elegant simplicity" category. I'd be apt to use the <<<" pipe in a script; echo string wins for the commandline. Well done.
    – Tom
    Jul 20, 2011 at 17:01
  • 5
    +1 for using printf correctly. If you want to have the sum without the -, put | cut -d ' ' -f 1. Example usage: sum=$(printf '%s' 'some string' | md5sum | cut -d ' ' -f 1)
    – Lekensteyn
    Jul 21, 2011 at 8:49
  • 1
    it's weird but the <<< operator and the printf function are giving completely different results for md5 hash! the result of printf is correct though!
    – 2hamed
    Jul 21, 2011 at 15:30
  • it seems using the <<< operator sends a newline to the md5sum!
    – 2hamed
    Jul 21, 2011 at 15:32
  • 1
    Yes, it does, as I said between first and second example
    – enzotib
    Jul 21, 2011 at 18:32
40
$ echo -n 123456 | md5sum | awk '{print $1}'
e10adc3949ba59abbe56e057f20f883e

you can create a shell script.

For example,the script name is md5.sh:

#!/bin/bash

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

permission execute:

 chmod +x md5.sh

Then:

$ md5.sh 123456
e10adc3949ba59abbe56e057f20f883e

If your system is macOS. You need to modify this script:

$ echo -n 123456 | md5 | awk '{print $1}' 
e10adc3949ba59abbe56e057f20f883e
6
  • 1
    This is just too long.
    – Gucho Ca
    May 12, 2016 at 3:40
  • 1
    alternative to awk: cut -d ' ' -f 1
    – phil294
    Nov 5, 2017 at 6:13
  • 1
    I created a function md5() { echo -n $1 | md5sum | awk '{print $1}'; } in .bashrc and then I can use $ md5 test in the command line. thanks for the answer Feb 20, 2019 at 14:34
  • Shorter awk command: '$0=$1' Jul 29, 2019 at 12:14
  • @AlexStragies yep
    – ty4z2008
    Jul 30, 2019 at 2:26
14
openssl md5 filename
openssl sha1 filename

For string pipe the content using echo

echo -n 123456 | openssl md5
11

Running md5sum with no arguments at all will cause it to read input from the terminal. Type or paste whatever you want, and when you are done, press ctrl-d to end the input.

2
  • 3
    yeah, you're right too. but ctrl+d needs to be pressed twice for it to work.
    – 2hamed
    Sep 30, 2011 at 13:57
  • @James, if it does not follow a newline, yes. If you hit it after hitting enter, it only needs once. When it does not follow a newline, it just forces all of the characters typed on the line so far to be processed immediately instead of waiting for a newline.
    – psusi
    Sep 30, 2011 at 14:42
7

My quick poke at the --help for md5sum demonstrates that the command:

md5sum -

will then give a prompt for simple input. Inputting some text and then using Enter and then Ctrl+D to signify end of file then causes md5sum to spit out the MD5 of the raw text you entered (including that Enter, it's a CR, IIRC).

Less to type and no piping! And avoiding your plaintext password being recorded in shell history! Woo!

If you do not want that trailing CR (which is usually the case if you want to hash a password), don't hit Enter before Ctrl+D, enter Ctrl+D twice instead.

4

There are many examples to do this, but some of them are not equivalent because some of them explicitly or implicitly include the newline, and some others do not.

I would like to clearly specify which of the popular methods includes the newline and which are not.

Here are some examples along to calculating the md5 hash WITHOUT trailing newline (CORRECT):

Using a file with text:

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

Note: -n in echo means: "do not output the trailing newline".

Using echo with -n inline:

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

Using printf:

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

Using only md5sum command:

(Let's write md5sum, press Enter then write string test and then press double combination Ctrl+d)

$ md5sum
test098f6bcd4621d373cade4e832627b4f6  -

Using md5sum - command:

(Let's write md5sum -, press Enter then write string test and then press double combination Ctrl+d)

$ md5sum -
test098f6bcd4621d373cade4e832627b4f6  -

Here are some examples along to calculating the md5 hash WITH trailing newline (SO NOT CORRECT):

Using a file with text:

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

Using echo WITHOUT -n inline:

echo "test" | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Using here strings:

$ md5sum <<< "test"
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Using only md5sum command but with Enter key after writing the text:

(Let's write md5sum, press Enter then write string test and then press agaien Enter and once combination Ctrl+d)

$ md5sum
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -

Using md5sum - command but with Enter key after writing the text:

(Let's write md5sum -, press Enter then write string test and then press agaien Enter and once combination Ctrl+d)

$ md5sum -
test
d8e8fca2dc0f896fd7cb4cb0031ba249  -
2

In my scripts I found that there are 2 things that you should know about this issue.

  • It does not matter if you do echo "$myvariable" or echo -n "$myvariable" but you should always use the doubleqoutes for strings and always use the same method. if not things won't match.
  • in the output you get always a trailing space and a dash as shown in the example:

    $ echo -n Welcome | md5sum
    7803ffcaea43bb81a439fde13b29bc35  -
    

to get rid of that and stay only with the code 7803ffcaea43bb81a439fde13b29bc35, do: echo "$myvariable" | md5sum | cut -d" " -f1

1
  • Don't forget the -n parameter here to avoid outputting the trailing newline, which would lead to a wrong md5: echo -n $myvariable | md5sum | cut -d" " -f1
    – derFunk
    Dec 3, 2015 at 19:28
1

For my case the best solution to hash a plain string is:

md5hash=$(echo -n "myhashedstring" | md5sum | head -c 32)

will result in 2e8f8b94e488a2f442a55951862612aa

Not the answer you're looking for? Browse other questions tagged or ask your own question.