Frage Wie kann Base64 über die Befehlszeile codiert werden?


Gibt es in Mac OS X einen Terminal-Befehl, mit dem Base64 eine Datei oder eine Standardeingabe codiert?


155
2018-03-16 23:15


Ursprung


Beachten Sie, dass die base64-codierende Syntax zwar von einem Betriebssystem zum anderen konsistent ist, die base64-Decodierungssyntax jedoch entweder base64 -d oder base64 -D abhängig von Ihrem Betriebssystem. OSX verwendet -D. - Chris Johnson
@ChrisJohnson Wenn zusammen mit verwendet openssl das Flag zum Decodieren ist -d auf OS X (10.10 Yosemite). - ᴠɪɴᴄᴇɴᴛ


Antworten:


openssl kann das für Sie tun, und es ist alles standardmäßig mit OS X installiert; keine Notwendigkeit, Darwinports zu installieren.

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

Ohne das -in Option liest von Standard


175
2018-03-17 00:25



Benutzen openssl base64 < path/to/file.png | tr -d '\n' | pbcopy oder cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy Überspringen Sie das Schreiben in eine Datei und kopieren Sie einfach die base64-codierte Ausgabe in die Zwischenablage ohne Zeilenumbrüche. - Mathias Bynens
Und benutze a -d Flagge zu decodieren. - kenny
In Mac, To Base64 eine Zeichenfolge codieren: openssl base64 -e <<< ram und entschlüsseln: openssl base64 -d <<< cmFtCg== - Ram Patra
@Mathias, wenn Sie keine Zeilenumbrüche möchten openssl base64 [-e] -A macht das. + @kenny bei der Dekodierung, wenn die Eingabe nicht alle 76 Zeichen maximal hat, einschließlich des Falls, den ich gerade angegeben habe, brauchen Sie -d -A oder Sie erhalten fehlende oder beschädigte Daten ohne Fehlermeldung (Es gibt jedoch einen ausstehenden Fehlerbericht, der zu einer Fehlerbehebung führen kann). - dave_thompson_085
@RAM, openssl base64 -e <<< ram codiert tatsächlich 4 Bytes, einschließlich eines Schlepplinienvorschubs; sehen hexdump <<< ram. - Arjan


Openssl kann prägnanter verwendet werden:

echo -n 'input' | openssl base64

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

oder

openssl base64 <ENTER> [type input] <CTRL+D>

60
2018-04-21 06:12



Die "Echo" -Lösung fügt dem Ende der Eingabezeichenfolge jedoch ein LF-Zeichen (Zeilenvorschub) hinzu. Bessere Verwendung: echo -n 'Eingabe' - SuperTempel
Und sogar ein bisschen prägnanter openssl base64 <<< input - Garrett Fogerlie
Oder benutze es einfach base64 ohne openssl. In beiden Fällen 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 Ausbeute c3VwZXJ1c2VyCg==, da die "here string" dann noch einen Zeilenvorschub enthält! (Anscheinend nicht nur in Bash, sondern auch in zsh, ksh und yash. Sehen hexdump <<< superuser. Das Base64-Ergebnis sollte sein c3VwZXJ1c2Vy.) - Arjan
@Arjan Ich würde zögern, das Wort "irrtümlich" zu verwenden - wie Sie darauf hingewiesen haben, enthält die hier-Zeichenfolge einen Zeilenvorschub, aber aus gutem Grund - unix.stackexchange.com/questions/20157/... . echo -n wird bevorzugt, wenn Sie den Zeilenumbruch nicht benötigen. Es ist sicherlich etwas zu beachten. - Steve Folly
Du könntest benutzen printf anstelle von echo -n - Jason S


Versuchen Sie es mit:

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

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


31
2018-02-27 20:13



Groß. einfach und elegant. Vielen Dank! - Leon li


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

Sie können verwenden base64 <<< string und base64 -D <<< string eine Zeichenkette im Terminal zu kodieren und zu dekodieren, oder base64 -in file und base64 -D -in file um eine Datei zu kodieren und zu dekodieren.


21
2018-03-17 02:48



Hast du ein Beispiel? Ich bekomme Invalid characer in input stream beim Benutzen <<<... Ich habe es versucht ", ' und nichts um die Saite. - Jonas
@ Jonas In welcher Shell bist du? Sie können dies in bash und zsh verwenden. - WKPlus
Ah, vergiss es, es funktioniert! - Jonas


In Bezug auf die Geschwindigkeit würde ich OpenSSL gefolgt von Perl verwenden, gefolgt von UUENCODE. In Bezug auf Portabilität würde ich UUENCODE gefolgt von Perl gefolgt von OpenSSL verwenden (Wenn Sie den Code auf so vielen anderen UNIX-ähnlichen Plattformen 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(<>){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 die Datei "file_in.txt" für base64 wie von angegeben festzulegen RFC1521 und schreibe es in filename.b64 (mit filename_when_uudecoded.txt als Standard-Dateinamen 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

5
2017-09-05 07:43





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

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

Oder installieren coreutils über Brauen (brew install coreutils) die liefern wird base64 Befehl:

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

5
2018-05-25 17:19





Du kannst es auch direkt in die Zwischenablage (zumindest auf Mac) pipen:

openssl base64 -in [filename] | pbcopy


4
2017-07-12 15:39



Golf: base64 < [filename] | pbcopy - totels


uuencode -m [-o output_file] [file] name

Woher Name ist der Name, der im codierten Header angezeigt wird.

Beispiel:

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

oder

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css

2
2018-04-04 20:12



uuencode ist nicht die Codierung als base64 - ccpizza


Aus irgendeinem Grund, echo -n <data> | openssl base64 Fügte einen Zeilenumbruch in der Mitte meiner Base64-Daten hinzu. Ich nehme an, es war, weil meine Base64-Daten wirklich lang waren.

Verwenden echo -n <data> | base64 kodieren und echo -n <base64-ed data> | base64 -D zu entschlüsseln hat gut funktioniert.


2
2017-07-27 05:16



nb: auf meinem nix musste ich -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | verwenden base64 -d someuser: einpasswort - mlo55