Wie kodiert man base64 über die Befehlszeile?
Gibt es einen Terminal-Befehl in Mac OS X, der base64 eine Datei oder stdin kodiert?
Gibt es einen Terminal-Befehl in Mac OS X, der base64 eine Datei oder stdin kodiert?
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
Versuchen Sie es mit:
base64 -i <in-file> -o <outfile>
Es sollte standardmäßig unter OS X verfügbar sein.
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.
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
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
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.
## 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.
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
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.
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
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=
$
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.
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.
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.