Wie codiere ich base64 über die Kommandozeile?

153297
Josh

Gibt es in Mac OS X einen Terminalbefehl, der base64 eine Datei oder stdin codiert?

169
Beachten Sie, dass, obwohl die base64-Kodierungssyntax von einem Betriebssystem zum anderen konsistent ist, die base64-Dekodierungssyntax je nach Betriebssystem entweder `base64 -d` oder` base64 -D` ist. OSX verwendet '-D'. Chris Johnson vor 11 Jahren 4
@ChrisJohnson Wenn er zusammen mit `openssl` verwendet wird, ist das Flag für die Dekodierung unter OS X (-10) (-10) (Yosemite). ᴠɪɴᴄᴇɴᴛ vor 9 Jahren 0

16 Antworten auf die Frage

186
Steve Folly

opensslkann dies für Sie tun, und es ist alles standardmäßig mit OS X installiert; Darwinports müssen nicht installiert werden.

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

Ohne die -inOption liest von stdin

Verwenden Sie `openssl base64 <Pfad / zu / Datei.png | tr -d '\ n' | pbcopy` oder `cat path / to / file.png | openssl base64 | tr -d '\ n' | pbcopy`, um das Schreiben in eine Datei zu überspringen und die base64-codierte Ausgabe einfach in die Zwischenablage zu kopieren, ohne dass die Zeilenumbrüche dazu führen. Mathias Bynens vor 13 Jahren 69
Und zum Dekodieren eine '-d'-Flagge verwenden. kenny vor 10 Jahren 1
In mac, Um base64 einen String zu kodieren: `openssl base64 -e <<< ram` und zum Dekodieren:` openssl base64 -d <<< cmFtCg == ` Ram Patra vor 9 Jahren 5
Gibt es eine Möglichkeit, den base64-codierten String im Terminal auszugeben? think123 vor 9 Jahren 0
Egal, ich habe es gefunden: `openssl base64 <Pfad / zu / Datei` sollte gut funktionieren. think123 vor 9 Jahren 0
@mathias, wenn Sie keine Zeilenumbrüche wünschen `openssl base64 [-e] -A` tut das. + @kenny on decode, wenn bei der Eingabe nicht alle 76 Zeichen ein Zeilenvorschub vorhanden ist, einschließlich des Falls, den ich gerade angegeben habe, Sie brauchen `-d -A`, oder Sie erhalten fehlende oder beschädigte Daten * ohne Fehlermeldung * ( obwohl es einen anstehenden Fehlerbericht gibt, der zu einer Korrektur führen kann) dave_thompson_085 vor 9 Jahren 6
@Ram, `openssl base64 -e <<< ram 'kodiert tatsächlich 4 Bytes, einschließlich eines nachlaufenden Zeilenvorschubs; siehe `hexdump <<< ram '. Arjan vor 9 Jahren 2
Ich musste -D anstelle von Kleinbuchstaben -d verwenden kendepelchin vor 7 Jahren 0
67
Glen

Openssl kann prägnanter verwendet werden:

echo -n 'input' | openssl base64 

[echo -n -> muss verwendet werden, oder die Kodierung wird mit einem neuen Zeilenzeichen durchgeführt.]

oder

openssl base64 <ENTER> [type input] <CTRL+D> 
Die "echo" -Lösung fügt jedoch am Ende der Eingabezeichenfolge ein LF-Zeichen (Zeilenvorschub) hinzu. Besser verwenden: echo -n 'input' SuperTempel vor 12 Jahren 9
Und noch etwas prägnant `openssl base64 <<< input` Garrett Fogerlie vor 11 Jahren 6
Oder verwenden Sie einfach `base64` ohne` openssl`. So oder so muss ich zweimal Strg + D drücken. Und Vorsicht, @Garret: in Bash mit oder ohne "openssl", "openssl base64 <<< Superuser" und "openssl base64 <<<" Superuser "` ** fälschlicherweise ** ergibt "c3VwZXJ1c2VyCg ==", wie das " Hier String "dann noch einen Zeilenvorschub! ([Scheinbar] (https://lists.gnu.org/archive/html/bug-bash/2015-02/msg00096.html) nicht nur in Bash, sondern auch in zsh, ksh und yash. Siehe `hexdump << <Superuser`. Das Base64-Ergebnis sollte `c3VwZXJ1c2Vy` sein.) Arjan vor 9 Jahren 2
@Arjan Ich würde zögern, das Wort "irrtümlich" zu verwenden - wie Sie darauf hingewiesen haben, enthält die Here-Zeichenfolge einen Zeilenvorschub, aber aus gutem Grund - http://unix.stackexchange.com/questions/20157/why-does -a-bash-here-string-add-a-trailing-newline-char. `echo -n` wird bevorzugt, wenn Sie den Newline nicht benötigen. Es ist sicherlich etwas zu beachten. Steve Folly vor 9 Jahren 0
@Steve, in der Tat sind es nicht "openssl base64" oder Bash, die schuld sind. Es ist jedoch sicherlich nicht das erwartete Ergebnis, wenn das Wort "input" codiert wird, daher wollte ich sicherstellen, dass das "irrtümlich" von zukünftigen Lesern gesehen wird ;-) Arjan vor 9 Jahren 0
Sie könnten "printf" anstelle von "echo -n" verwenden Jason S vor 8 Jahren 2
34
Derreck Dean

Versuchen Sie es mit:

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

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

Großartig. einfach und elegant. Vielen Dank! Leon li vor 6 Jahren 1
Fügen Sie "--decode" hinzu, um den Vorgang von base64 auf normal umzukehren. luckydonald vor 5 Jahren 0
24
WKPlus

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

Sie können base64 <<< stringund verwenden base64 -D <<< string, um eine Zeichenfolge im Terminal zu codieren und zu decodieren, oder base64 -in fileund base64 -D -in fileund, um eine Datei zu codieren und zu decodieren.

Hast du ein Beispiel? Ich bekomme `Invalid Characer in Input Stream`, wenn ich '<<<' verwende ... Ich habe es mit` `` `,` `` und nichts in der Zeichenfolge versucht. Jonas vor 8 Jahren 0
@Jonas In welcher Schale bist du? Sie können dies in bash und zsh verwenden. WKPlus vor 8 Jahren 0
Ah, vergiss es, es funktioniert! Jonas vor 8 Jahren 0
6
kenorb

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 coreutilsüber Brew ( brew install coreutils) installieren, das den base64Befehl liefert :

$ echo FOO | base64 Rk9PCg== $ echo Rk9PCg== | base64 -d FOO 
5
phiz

In Bezug auf die Geschwindigkeit würde ich openssl verwenden, gefolgt von perl, gefolgt von uuencode. In Bezug auf die Portabilität würde ich uuencode, gefolgt von Perl, gefolgt von openssl (verwenden, wenn Sie den Code auf möglichst vielen anderen UNIX-ähnlichen Plattformplattformen wie möglich wiederverwenden möchten). 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(<>)' \ > 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 gemäß den Angaben von RFC1521 zu uuencode zu schreiben und in dateiname.b64 zu schreiben (mit Dateiname_when_uudecoded.txt als Standarddateiname bei der Dekodierung):

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 
4
Steve

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

openssl base64 -in [filename] | pbcopy

Golfen: `base64 <[Dateiname] | pbcopy` totels vor 8 Jahren 0
2
user214207
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" ist nicht die Kodierung als "base64" ccpizza vor 7 Jahren 0
2
ccpizza

Python

Heutzutage ist Python auf allen Macs vorinstalliert.

In Terminal ausführen python(oder ipython ).

Eine Datei kodieren:

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

Eine Datei dekodieren:

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

Natürlich können beide Vorgänge in einen Oneliner konvertiert werden, auf diese Weise sind sie jedoch 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 

Auslassen von -out/ -output... filenamewird an 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 
2
Heath Borders

Aus irgendeinem Grund wurde echo -n <data> | openssl base64in den Base64-Daten ein Zeilenumbruch hinzugefügt. Ich gehe davon aus, dass meine base64-Daten wirklich lang waren.

Die echo -n <data> | base64Kodierung und echo -n <base64-ed data> | base64 -DDekodierung funktionierte einwandfrei.

nb: auf meinem nix musste ich -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | verwenden base64 -d Someuser: Somepassword mlo55 vor 8 Jahren 0