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.
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]
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.
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.
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:
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):
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
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.
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.
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:
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.
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.
base64 -d
oderbase64 -D
je nach Betriebssystem. OSX verwendet-D
.openssl
dem Flag für die Decodierung-d
unter OS X (10.10 Yosemite) verwendet.Antworten:
openssl
kann dies für Sie tun und alles wird standardmäßig mit OS X installiert. darwinports muss nicht installiert werden.Ohne die
-in
Option liest stdin ausquelle
openssl base64 < path/to/file.png | tr -d '\n' | pbcopy
odercat 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.-d
Flag um zu dekodieren.openssl base64 -e <<< ram
und decodieren:openssl base64 -d <<< cmFtCg==
openssl base64 [-e] -A
macht 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 -A
werden fehlende oder beschädigte Daten ohne Fehlermeldung angezeigt (obwohl ein Fehlerbericht vorliegt, der noch aussteht) kann zu einer Behebung führen).openssl base64 -e <<< ram
codiert tatsächlich 4 Bytes, einschließlich eines Zeilenvorschubs am Ende; sehenhexdump <<< ram
.Openssl kann prägnanter verwendet werden:
[echo -n -> muss verwendet werden, andernfalls erfolgt die Codierung einschließlich neuer Zeilenzeichen]
oder
quelle
openssl base64 <<< input
base64
ohne verwendenopenssl
. In beiden Fällen muss ich zweimal Strg + D drücken. Und Vorsicht, @Garret: in Bash, mit oder ohneopenssl
,openssl base64 <<< superuser
undopenssl base64 <<< "superuser"
fälschlicherweise nachgebenc3VwZXJ1c2VyCg==
, da der "Hier-String" dann noch einen Zeilenvorschub enthält! ( Anscheinend nicht nur in Bash, sondern auch in zsh, ksh und yash. Siehehexdump <<< superuser
. Das Base64-Ergebnis sollte seinc3VwZXJ1c2Vy
.)echo -n
ist vorzuziehen, wenn Sie den Zeilenumbruch nicht benötigen. Es ist sicherlich etwas zu beachten.printf
anstelle vonecho -n
Versuchen Sie es mit:
Es sollte standardmäßig unter OS X verfügbar sein.
quelle
--decode
, um den Vorgang von base64 auf normal umzukehren.openssl base64
. Vielen Dank!base64
Befehl ist standardmäßig in meinem OS X 10.9.4 verfügbar.Sie können verwenden
base64 <<< string
undbase64 -D <<< string
zu codieren und einen String im Terminal zu entschlüsseln, oderbase64 -in file
undbase64 -D -in file
zu codieren und eine Datei zu entschlüsseln.quelle
Invalid characer in input stream
bei der Verwendung von<<<
... Ich habe versucht , mit"
,'
und nichts um die Zeichenfolge.Da Python standardmäßig mit OS X geliefert wird, können Sie es wie folgt verwenden:
Oder installieren Sie
coreutils
über Brew (brew install coreutils
), das denbase64
Befehl liefert :quelle
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).
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):
STDIN Beispiel:
quelle
Sie können es auch direkt in die Zwischenablage leiten (zumindest auf einem Mac):
openssl base64 -in [filename] | pbcopy
quelle
base64 < [filename] | pbcopy
Unter macOS benutze ich immer:
echo -n "STRING" | base64
-n soll ein neues Zeilenzeichen am Zeilenende vermeiden.
quelle
Python
Python ist heutzutage auf allen Macs vorinstalliert.
Im Terminal laufen
python
(oder ipython ).Datei verschlüsseln:
Dekodiere eine Datei:
Natürlich können beide Operationen in einen Oneliner umgewandelt werden, aber auf diese Weise ist es besser lesbar.
OpenSSL
Wenn Sie das
-out
/ weglassen,-output... filename
wird auf stdout gedruckt.base64
Ein weiteres ootb-Dienstprogramm, das sowohl in OSX als auch in Ubuntu vorhanden ist:
quelle
Wobei name der Name ist, der im codierten Header angezeigt werden soll.
Beispiel:
oder
quelle
uuencode
ist nicht die Kodierung alsbase64
Aus irgendeinem Grund wurde
echo -n <data> | openssl base64
eine 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> | base64
zu codieren undecho -n <base64-ed data> | base64 -D
zu decodieren hat gut funktioniert.quelle
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:
Alternativ können Sie Folgendes verwenden
printf
:quelle
Es gibt Perl plus MIME :: 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:
Dies sichert Datei1 in Datei1.txt und schreibt die Base-64-codierte Ausgabe über die Originaldatei.
quelle
Eine einfache NodeJS-Version:
quelle
openssl
(und jetztbase64
) mit dem Betriebssystem.recode sollte den Trick für dich tun
recode ist für OS X über MacPorts verfügbar .
quelle
base64
Befehl.Wenn Sie eine Schriftartdatei mit base64 codieren, können Sie dies tun:
Ich benutze dies die ganze Zeit auf einem Mac (10.10).
Hinweis : Es werden keine Zeilenumbrüche angezeigt.
quelle
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.key
in den Beispielen benannt) ohne Zeilenumbruch in base64 konvertiert. Die base64-Ausgabe wird über stdout auf das Terminal gedruckt.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.
quelle