243
74
Is there a terminal command in Mac OS X which will base64 encode a file or stdin?
243
74
Is there a terminal command in Mac OS X which will base64 encode a file or stdin?
252
openssl
can do this for you, and it's all installed with OS X by default; no need to install darwinports.
$ openssl base64 -in <infile> -out <outfile>
Without the -in
option reads from stdin
6In mac, To base64 encode a string: openssl base64 -e <<< ram
and to decode: openssl base64 -d <<< cmFtCg==
– Ram Patra – 2014-11-13T10:52:24.640
is there an option to output the base64-encoded string in the terminal? – Lucas – 2015-04-08T00:19:09.183
never mind, I found it: openssl base64 < path/to/file
should work fine. – Lucas – 2015-04-08T00:19:37.840
8@mathias if you want no newlines openssl base64 [-e] -A
does that. + @kenny on decode if input does not have newline every 76 chars at most, including the no-newlines case I just stated, you need -d -A
or you will get missing or corrupted data with no error message (although there is a pending bug report which may result in a fix to that). – dave_thompson_085 – 2015-05-27T14:54:50.767
2@Ram, openssl base64 -e <<< ram
actually encodes 4 bytes, including a trailing line feed; see hexdump <<< ram
. – Arjan – 2015-06-03T20:39:55.343
I had to use -D instead of the lowercase -d – kendepelchin – 2017-08-09T14:06:01.780
Taking @MathiasBynens even further: pbpaste | openssl base64 -A | pbcopy
to automagically transform what's on your clipboard into base64. (added -A) – evan.bovie – 2019-02-01T23:03:57.883
79Use openssl base64 < path/to/file.png | tr -d '\n' | pbcopy
or cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy
to skip writing to a file and just copy the base64-encoded output to the clipboard without the line breaks. – Mathias Bynens – 2011-04-12T13:07:08.003
4And use a -d
flag to decode. – kenny – 2013-12-11T22:26:57.780
107
Openssl can be used more succinctly:
echo -n 'input' | openssl base64
[ echo -n -> must be used, or encoding will be done including new line character ]
or
openssl base64 <ENTER> [type input] <CTRL+D>
2
Or just use base64
without openssl
. Either way, I need to press Ctrl+D twice. And beware, @Garret: in Bash, with or without openssl
, openssl base64 <<< superuser
and openssl base64 <<< "superuser"
erroneously yield c3VwZXJ1c2VyCg==
, as the "here string" then still includes a line feed! (Apparently not only in Bash, but also in zsh, ksh and yash. See hexdump <<< superuser
. The Base64 result should be c3VwZXJ1c2Vy
.)
@Arjan I'd hesitate to use the word "erroneously" - as you pointed out, the here-string includes a line feed, but for good reason - http://unix.stackexchange.com/questions/20157/why-does-a-bash-here-string-add-a-trailing-newline-char . echo -n
is preferred if you don't need the newline. It's certainly something to be aware of.
@Steve, indeed, it's not openssl base64
nor Bash that are to blame. But it surely is not the expected outcome when encoding the word input
, so I wanted to ensure the "erroneously" is seen by future readers ;-) – Arjan – 2015-06-05T07:51:57.770
2You could use printf
in place of echo -n
– Jason S – 2016-09-05T06:08:08.827
the works very well, thanks – ikel – 2019-04-22T23:27:47.443
10The "echo" solution adds a LF (line feed) char to the end of the input string, though. Better use: echo -n 'input' – SuperTempel – 2012-07-17T15:17:23.130
8And even a bit more succinct openssl base64 <<< input
– Garrett Fogerlie – 2013-06-06T16:57:06.993
54
Try using:
base64 -i <in-file> -o <outfile>
It should be available by default on OS X.
2Add --decode
to reverse the process from base64 to normal. – luckydonald – 2018-11-02T14:05:51.353
2This is better for encoding for SVG because it creates one line. This is cleaner than the output from openssl base64
. Thanks! – Shanimal – 2019-04-18T01:35:43.543
34
base64
command is available by default on my OS X 10.9.4.
You can use base64 <<< string
and base64 -D <<< string
to encode and decode a string in the terminal, or base64 -in file
and base64 -D -in file
to encode and decode a file.
Do you have an example? I get Invalid characer in input stream
when using <<<
...I have tried with "
, '
and nothing around the string. – Jonas – 2016-09-20T11:46:13.550
@Jonas What shell are you in? You can use this in bash and zsh. – WKPlus – 2016-09-21T12:42:28.340
Ah, nevermind, it works! – Jonas – 2016-09-22T08:46:24.107
16
On macOS I always use:
echo -n "STRING" | base64
-n is to avoid a new line character on the end of the line.
8
Since Python is provided with OS X by default, you can use it as below:
$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO
Or install coreutils
via Brew (brew install coreutils
) which will provide base64
command:
$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
5
You can also pipe it right to the clipboard (at least on mac):
openssl base64 -in [filename] | pbcopy
golfing: base64 < [filename] | pbcopy
– totels – 2016-08-11T19:57:36.213
5
In terms of speed, I would use openssl followed by perl, followed by uuencode. In terms of portability, I would use uuencode followed by Perl followed by openssl (If you care about reusing the code on as many other UNIX like stock platforms as possible). Be careful though because not all UNIX variants support the -m switch (iirc AIX does, HP/UX does, Solaris doesn't).
$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real 0m0.025s
$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real 0m0.051s
$ time openssl base64 -in out.jpg -out filename.b64
real 0m0.017s
Use the -m switch to uuencode file_in.txt per base64 as specified by RFC1521 and write it to filename.b64 (with filename_when_uudecoded.txt as the default filename when decoded):
uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt
STDIN example:
cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
3
Python comes preinstalled on all macs nowadays.
In Terminal run python
(or ipython).
Encode a file:
base64data = open('myfile.jpg','rb').read().encode('base64')
open('myfile.txt','w').write(base64data)
Decode a file:
data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)
Of course, both operations can be converted to a oneliner but this way it is more readable.
## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64
## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64
## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg
## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg
Omitting the -out
/-output... filename
will print to stdout.
Another ootb utility present both in OSX and Ubuntu:
## encode to base64
base64 < myfile.jpg > myfile.jpg.b64
## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg
## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg
2
In addition to Steve Folly's answer above, when encrypting in stdin mode, to avoid passing extra newlines, press CTRL+D twice to end input without any additional newlines. Output will show right after the same line.
For example:
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$
Alternatively, you could use printf
:
$ printf 'input' | openssl base64
aW5wdXQ=
$
2
uuencode -m [-o output_file] [file] name
Where name is the name to display in the encoded header.
Example:
cat docbook-xsl.css | uuencode -m docbook-xsl.css
or
uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
uuencode
is not the encoding as base64
– ccpizza – 2016-11-17T07:27:43.857
2
For some reason, echo -n <data> | openssl base64
added a newline in the middle of my base64 data. I assume it was because my base64 data was really long.
Using echo -n <data> | base64
to encode and echo -n <base64-ed data> | base64 -D
to decode worked fine.
nb: on my nix, i had to use -d
echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d
someuser:somepassword – mlo55 – 2016-04-14T00:07:55.003
1
If you are base64 encoding a font file, you can do this:
base64 my-webfont.ttf > my-webfont.b64.ttf.txt
I use this on a Mac (10.10) all the time.
Note: There will be no linebreaks.
1
recode should do the trick for you
recode ../b64 < file.txt > file.b64
recode is available for OS X via MacPorts.
There's nothing built in? – Josh – 2010-03-17T00:24:12.163
@Josh - there is - openssl – Steve Folly – 2010-03-17T00:25:51.380
MacPorts does not come with any OS X distribution. There are plenty of other options that do. For instance just base64
command. – Jason S – 2016-09-05T06:05:03.830
1
There is Perl plus MIME::Base64:
perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'
This comes pre-installed. You can specify separate files on the command line (or supply the data on standard input); each file is separately encoded. You can also do:
perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1
This backs up file1 to file1.txt, and writes the Base-64 encoded output over the original file.
1
We compiled a list of cross-platform shell commands to encode a file as base64. The following commands take an input file (named deploy.key
in examples) and convert it to base64 without any newline wrapping. The base64 output is printed to the terminal via stdout.
# For systems with openssl
openssl base64 -A -in=deploy.key
# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"
# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key
# For macOS systems
base64 --break=1000000 deploy.key
To redirect the output to a file, append > base64-encoded.txt
(using a file name of your choosing).
These commands were prototyped as part of this pull request where we wanted cross-platform shell commands to base64 encode an SSH private key to remove newlines.
1
A simple NodeJS version:
node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
I don't think this is a better answer as openssl
(and now base64
) come with the OS. – Josh – 2015-03-27T15:01:24.217
At the risk of splitting hairs — and, I’m aware that this criticism applies to a couple of the other answers, as well — the question asked how to encode *a file* or *stdin*. If I’m not mistaken, your answer shows only how to encode a string. – G-Man Says 'Reinstate Monica' – 2015-03-27T19:00:19.587
@ChrisJohnson If used in concert with
openssl
the flag for decoding is-d
on OS X (10.10 Yosemite). – ᴠɪɴᴄᴇɴᴛ – 2015-06-10T12:11:49.6676Be aware that although the base64-encoding syntax is consistent from one OS to another, the base64-decoding syntax is either
base64 -d
orbase64 -D
depending on your operating system. OSX uses-D
. – Chris Johnson – 2012-11-30T22:06:36.140