2010-03-16 23:15:37 +0000 2010-03-16 23:15:37 +0000
243
243

Wie kodiert man base64 über die Befehlszeile?

Gibt es einen Terminal-Befehl in Mac OS X, der base64 eine Datei oder stdin kodiert?

Antworten (17)

252
252
252
2010-03-17 00:25:08 +0000

openssl kann dies für Sie erledigen, und es ist alles standardmäßig mit OS X installiert; es ist nicht notwendig, darwinports zu installieren.

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

Ohne die Option -in liest aus stdin

107
107
107
2010-04-21 06:12:44 +0000

Openssl kann prägnanter verwendet werden:

echo -n 'input' | openssl base64

[echo -n -> muss verwendet werden, oder die Kodierung erfolgt mit Zeilenumbruchszeichen]

oder

openssl base64 <ENTER> [type input] <CTRL+D>
54
54
54
2015-02-27 20:13:36 +0000

Versuchen Sie es mit:

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

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

34
34
34
2016-03-17 02:48:49 +0000

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

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

16
16
16
2017-08-01 05:33:00 +0000

Auf MacOS verwende ich immer:

echo -n "STRING" | base64

-n ist, um einen Zeilenumbruch am Ende der Zeile zu vermeiden.

8
8
8
2015-05-25 17:19:49 +0000

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

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

Oder installieren Sie coreutils über Brew (brew install coreutils), was den Befehl base64 liefert:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
5
5
5
2012-09-05 07:43:32 +0000

Was die Geschwindigkeit betrifft, würde ich openssl gefolgt von perl, gefolgt von uuencode verwenden. Im Hinblick auf die 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 -m-Switch unterstützen (iirc AIX tut es, HP/UX tut es, Solaris tut es 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 den -m-Switch zur uuencode-Datei_in. txt per base64 gemäß RFC1521 und schreiben Sie sie in dateiname.b64 (mit filename_when_uudecoded.txt als Standarddateiname beim Dekodieren):

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
5
5
2016-07-12 15:39:22 +0000

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

openssl base64 -in [filename] | pbcopy

3
3
3
2014-06-17 10:00:25 +0000

Python

Python ist heutzutage auf allen Macs vorinstalliert.

Im Terminal führen Sie python (oder ipython ) aus.

Kodieren Sie eine Datei:

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

Dekodieren Sie eine Datei:

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

Natürlich können beide Operationen in einen Oneliner konvertiert werden, aber auf diese Weise ist er 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

Ohne -out/-output... filename wird nach stdout gedruckt.

base64

Ein weiteres ootb-Utility, 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
2
2
2014-07-27 05:16:22 +0000

Aus irgendeinem Grund fügte echo -n <data> | openssl base64 einen Zeilenumbruch in der Mitte meiner base64-Daten hinzu. Ich nehme an, es lag daran, dass meine base64-Daten sehr lang waren.

Die Verwendung von echo -n <data> | base64 zum Kodieren und echo -n <base64-ed data> | base64 -D zum Dekodieren funktionierte gut.

2
2
2
2013-04-04 20:12:06 +0000
uuencode -m [-o output_file] [file] name

wobei name der Name ist, der in der kodierten Kopfzeile 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
2
2
2
2016-07-27 18:14:32 +0000

Zusätzlich zu der obigen Antwort von Steve Folly sollten Sie beim Verschlüsseln im stdin-Modus, um zusätzliche Zeilenumbrüche zu vermeiden, zweimal STRG+D drücken, um die Eingabe ohne zusätzliche Zeilenumbrüche zu beenden. Die Ausgabe wird direkt nach der gleichen Zeile angezeigt.

Zum Beispiel:

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

Alternativ könnten Sie printf verwenden:

$ printf 'input' | openssl base64
aW5wdXQ=
$
1
1
1
2010-03-17 04:24:21 +0000

Es gibt Perl plus MIME::Base64:

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

Dies ist bereits vorinstalliert. Sie können separate Dateien auf der Befehlszeile angeben (oder die Daten über die Standardeingabe liefern); jede Datei wird separat kodiert. Sie können auch Folgendes tun:

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

Dies sichert file1 in file1.txt und schreibt die Base-64-kodierte Ausgabe über die Originaldatei.

1
1
1
2016-04-18 22:13:21 +0000

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

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

Ich verwende dies ständig auf einem Mac (10.10).

Hinweis : Es wird keine Zeilenumbrüche geben.

1
1
1
2010-03-17 00:00:24 +0000

recode sollte für Sie genügen

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

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

1
1
1
2019-07-08 16:00:26 +0000

Cross-platform solutions

Wir haben eine Liste von plattformübergreifenden Shell-Befehlen zur Kodierung einer Datei als base64 zusammengestellt. Die folgenden Befehle nehmen eine Eingabedatei (in Beispielen deploy.key genannt) und konvertieren sie ohne Zeilenumbruch nach base64. Die base64-Ausgabe wird über stdout auf das Terminal ausgegeben.

# 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 > base64-encoded.txt an (mit einem Dateinamen Ihrer Wahl).

Diese Befehle wurden als Teil dieser pull request prototypisch erstellt, wo wir plattformübergreifende Shell-Befehle zur base64-Kodierung eines privaten SSH-Schlüssels zum Entfernen von Zeilenumbrüchen wollten.

1
1
1
2015-03-27 13:09:24 +0000

Eine einfache NodeJS-Version:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"