Wie codiere ich base64 über die Kommandozeile?

215

Gibt es unter Mac OS X einen Terminalbefehl, mit dem base64 eine Datei oder stdin codiert?

Josh
quelle
5
Beachten Sie, dass , obwohl die Base64-kodiert Syntax von einem Betriebssystem zum anderen konsistent ist, die Base64-Dekodierung Syntax entweder ist base64 -doder base64 -Dje nach Betriebssystem. OSX verwendet -D.
Chris Johnson
@ChrisJohnson Wird zusammen mit openssldem Flag für die Decodierung -dunter OS X (10.10 Yosemite) verwendet.
ᴠɪɴᴄᴇɴᴛ

Antworten:

229

opensslkann dies für Sie tun und alles wird standardmäßig mit OS X installiert. darwinports muss nicht installiert werden.

$ openssl base64 -in <infile> -out <outfile>

Ohne die -inOption liest stdin aus

Steve Folly
quelle
79
Verwenden Sie openssl base64 < path/to/file.png | tr -d '\n' | pbcopyoder cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy, um das Schreiben in eine Datei zu überspringen und die Base64-codierte Ausgabe ohne Zeilenumbrüche in die Zwischenablage zu kopieren.
Mathias Bynens
3
Und benutze ein -dFlag um zu dekodieren.
Kenny
5
Auf einem Mac codieren To base64 einen String: openssl base64 -e <<< ramund decodieren:openssl base64 -d <<< cmFtCg==
Ram Patra
8
@mathias wenn du keine newlines willst openssl base64 [-e] -Amacht das. + @kenny bei der Dekodierung, wenn die Eingabe nicht alle 76 Zeichen einen Zeilenumbruch enthält, einschließlich des von mir angegebenen Falls, dass keine Zeilenumbrüche vorliegen. Andernfalls -d -Awerden fehlende oder beschädigte Daten ohne Fehlermeldung angezeigt (obwohl ein Fehlerbericht vorliegt, der noch aussteht) kann zu einer Behebung führen).
Dave_thompson_085
2
@Ram openssl base64 -e <<< ramcodiert tatsächlich 4 Bytes, einschließlich eines Zeilenvorschubs am Ende; sehen hexdump <<< ram.
Arjan,
93

Openssl kann prägnanter verwendet werden:

echo -n 'input' | openssl base64

[echo -n -> muss verwendet werden, andernfalls erfolgt die Codierung einschließlich neuer Zeilenzeichen]

oder

openssl base64 <ENTER> [type input] <CTRL+D>
Tal
quelle
10
Die "Echo" -Lösung fügt jedoch ein LF-Zeichen (Line Feed) am Ende der Eingabezeichenfolge hinzu. Besser verwenden: Echo -n "Eingabe"
SuperTempel
8
Und noch ein bisschen prägnanteropenssl base64 <<< input
Garrett Fogerlie
2
Oder einfach base64ohne verwenden openssl. In beiden Fällen muss ich zweimal Strg + D drücken. Und Vorsicht, @Garret: in Bash, mit oder ohne openssl, openssl base64 <<< superuserund openssl base64 <<< "superuser" fälschlicherweise nachgeben c3VwZXJ1c2VyCg==, da der "Hier-String" dann noch einen Zeilenvorschub enthält! ( Anscheinend nicht nur in Bash, sondern auch in zsh, ksh und yash. Siehe hexdump <<< superuser. Das Base64-Ergebnis sollte sein c3VwZXJ1c2Vy.)
Arjan
@Arjan Ich würde zögern, das Wort "irrtümlich" zu verwenden - wie Sie betont haben, enthält der Here-String einen Zeilenvorschub, aber aus gutem Grund - unix.stackexchange.com/questions/20157/… . echo -nist vorzuziehen, wenn Sie den Zeilenumbruch nicht benötigen. Es ist sicherlich etwas zu beachten.
Steve Folly
2
Sie könnten printfanstelle vonecho -n
Jason S
50

Versuchen Sie es mit:

base64 -i <in-file> -o <outfile>

Es sollte standardmäßig unter OS X verfügbar sein.

Derreck Dean
quelle
1
Hinzufügen --decode, um den Vorgang von base64 auf normal umzukehren.
luckydonald
1
Dies ist besser für die SVG-Codierung, da hierdurch eine Zeile erstellt wird. Dies ist sauberer als die Ausgabe von openssl base64. Vielen Dank!
Shanimal
32

base64 Befehl ist standardmäßig in meinem OS X 10.9.4 verfügbar.

Sie können verwenden base64 <<< stringund base64 -D <<< stringzu codieren und einen String im Terminal zu entschlüsseln, oder base64 -in fileund base64 -D -in filezu codieren und eine Datei zu entschlüsseln.

WKPlus
quelle
Hast du ein Beispiel? Ich bekomme Invalid characer in input streambei der Verwendung von <<<... Ich habe versucht , mit ", 'und nichts um die Zeichenfolge.
Jonas
@Jonas In welcher Shell bist du? Sie können dies in bash und zsh verwenden.
WKPlus
Ah, vergiss, es funktioniert!
Jonas
8

Da Python standardmäßig mit OS X geliefert wird, können Sie es wie folgt verwenden:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

Oder installieren Sie coreutilsüber Brew ( brew install coreutils), das den base64Befehl liefert :

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
Kenorb
quelle
5

In Bezug auf die Geschwindigkeit würde ich openssl gefolgt von perl gefolgt von uuencode verwenden. In Bezug auf die Portabilität würde ich uuencode gefolgt von Perl gefolgt von openssl verwenden. Seien Sie jedoch vorsichtig, da nicht alle UNIX-Varianten den Schalter -m unterstützen (iirc AIX, HP / UX, Solaris nicht).

$ 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

Verwenden Sie die Option -m, um file_in.txt pro base64 wie in RFC1521 angegeben zu uuencodieren und in filename.b64 zu schreiben (wobei filename_when_uudecoded.txt als Standarddateiname beim Dekodieren verwendet wird):

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

STDIN Beispiel:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
phiz
quelle
5

Sie können es auch direkt in die Zwischenablage leiten (zumindest auf einem Mac):

openssl base64 -in [filename] | pbcopy

Steve
quelle
Golfen:base64 < [filename] | pbcopy
Totels
5

Unter macOS benutze ich immer:

echo -n "STRING" | base64

-n soll ein neues Zeilenzeichen am Zeilenende vermeiden.

patrickS
quelle
3

Python

Python ist heutzutage auf allen Macs vorinstalliert.

Im Terminal laufen python(oder ipython ).

Datei verschlüsseln:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

Dekodiere eine Datei:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

Natürlich können beide Operationen in einen Oneliner umgewandelt werden, aber auf diese Weise ist es besser lesbar.

OpenSSL

## 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

Wenn Sie das -out/ weglassen, -output... filenamewird auf stdout gedruckt.

base64

Ein weiteres ootb-Dienstprogramm, das sowohl in OSX als auch in Ubuntu vorhanden ist:

## 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
ccpizza
quelle
2
uuencode -m [-o output_file] [file] name

Wobei name der Name ist, der im codierten Header angezeigt werden soll.

Beispiel:

cat docbook-xsl.css | uuencode -m docbook-xsl.css

oder

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
user214207
quelle
uuencodeist nicht die Kodierung alsbase64
ccpizza
2

Aus irgendeinem Grund wurde echo -n <data> | openssl base64eine neue Zeile in die Mitte meiner base64-Daten eingefügt. Ich nehme an, das lag daran, dass meine base64-Daten sehr lang waren.

Mit echo -n <data> | base64zu codieren und echo -n <base64-ed data> | base64 -Dzu decodieren hat gut funktioniert.

Heidegrenzen
quelle
nb: auf meinem nix musste ich -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | verwenden base64 -d someuser: somepassword
mlo55
2

Zusätzlich zu der obigen Antwort von Steve Folly drücken Sie beim Verschlüsseln im Standardmodus zweimal STRG + D, um die Eingabe ohne zusätzliche Zeilenumbrüche zu beenden, um das Übergeben zusätzlicher Zeilenumbrüche zu vermeiden. Die Ausgabe wird direkt nach derselben Zeile angezeigt.

Zum Beispiel:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

Alternativ können Sie Folgendes verwenden printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
bigT
quelle
1

Es gibt Perl plus MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

Dies ist vorinstalliert. Sie können separate Dateien in der Befehlszeile angeben (oder die Daten über die Standardeingabe bereitstellen). Jede Datei wird separat codiert. Sie können auch tun:

perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1

Dies sichert Datei1 in Datei1.txt und schreibt die Base-64-codierte Ausgabe über die Originaldatei.

Jonathan Leffler
quelle
1

Eine einfache NodeJS-Version:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauvm
quelle
Ich denke nicht, dass dies eine bessere Antwort ist als openssl(und jetzt base64) mit dem Betriebssystem.
Josh
Bei dem Risiko, Haare zu spalten - und ich bin mir bewusst, dass diese Kritik auch auf einige andere Antworten zutrifft - wurde die Frage gestellt, wie eine Datei oder ein Standardcode codiert werden soll . Wenn ich mich nicht irre, zeigt Ihre Antwort nur, wie man einen String codiert.
G-Man,
1

recode sollte den Trick für dich tun

recode ../b64 < file.txt > file.b64

recode ist für OS X über MacPorts verfügbar .

heavyyd
quelle
Es ist nichts eingebaut?
Josh
@Josh - da ist - openssl
Steve Folly
MacPorts wird ohne OS X-Distribution ausgeliefert. Es gibt viele andere Optionen, die dies tun. Zum Beispiel nur base64Befehl.
Jason S
1

Wenn Sie eine Schriftartdatei mit base64 codieren, können Sie dies tun:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

Ich benutze dies die ganze Zeit auf einem Mac (10.10).

Hinweis : Es werden keine Zeilenumbrüche angezeigt.

Chuck Ugwuh
quelle
1

Plattformübergreifende Lösungen

Wir haben eine Liste von plattformübergreifenden Shell-Befehlen zusammengestellt, um eine Datei als base64 zu kodieren. Mit den folgenden Befehlen wird eine Eingabedatei ( deploy.keyin den Beispielen benannt) ohne Zeilenumbruch in base64 konvertiert. Die base64-Ausgabe wird über stdout auf das Terminal gedruckt.

# 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

Um die Ausgabe in eine Datei umzuleiten, hängen Sie sie an > base64-encoded.txt(mit einem Dateinamen Ihrer Wahl).

Diese Befehle wurden als Teil dieser Pull-Anforderung als Prototyp erstellt, bei der plattformübergreifende Shell-Befehle zum Base64-Codieren eines privaten SSH-Schlüssels zum Entfernen von Zeilenumbrüchen benötigt wurden.

Daniel Himmelstein
quelle