Base64 on the command line

Published

Linux (GNU coreutils)

echo -n 'Hello' | base64          # SGVsbG8=
echo 'SGVsbG8=' | base64 -d       # Hello
base64 -w0 image.png > image.b64  # no line wrapping
base64 -d image.b64 > image.png

Always use echo -n (or printf). Plain echo appends a newline, so echo 'Hello' | base64 gives SGVsbG8K, the encoding of Hello\n.

By default GNU base64 wraps output at 76 characters. Use -w0 to get a single line, which is what you want for JSON, environment variables and HTTP headers.

Decode ignores newlines but fails on other junk unless you add -i (--ignore-garbage).

macOS (BSD)

base64 -i image.png -o image.b64   # encode, no wrapping by default
base64 -D -i image.b64 -o image.png
pbpaste | base64 -D                # decode the clipboard

Newer macOS versions accept -d as well.

OpenSSL (works everywhere)

openssl base64 -A -in file.bin -out file.b64   # -A = single line
openssl base64 -d -A -in file.b64 -out file.bin

Without -A, OpenSSL wraps at 64 characters and, when decoding, expects lines of at most 64 characters.

Windows

# PowerShell
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\img.png"))
[IO.File]::WriteAllBytes("C:\out.png", [Convert]::FromBase64String($b64))

# cmd.exe
certutil -encode in.bin out.b64   # adds BEGIN/END CERTIFICATE lines
certutil -decode out.b64 in.bin

Useful one-liners

# Basic auth header
printf '%s' 'user:pass' | base64

# Kubernetes secret values
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d

# Data URI for an image
echo "data:$(file -b --mime-type logo.png);base64,$(base64 -w0 logo.png)"

# Decode Base64URL (JWT payload)
cut -d. -f2 <<<"$JWT" | tr '_-' '/+' | base64 -d 2>/dev/null

The last command may complain about missing padding; the JWT decoder handles that for you.

Comments (0)

Questions, ideas or a bug in “Base64 on the command line”? Leave a comment, rate the tool, or reply to others.

No comments yet. Be the first to share your feedback!

Leave a comment

Rate this tool:
Esc
↑ ↓ move↵ openEsc close