Frage Wie kann ich eine Base64-Zeichenfolge von der Befehlszeile dekodieren?


Ich möchte ein Bash-Skript schreiben, um eine Base64-Zeichenfolge zu dekodieren. Zum Beispiel tippe ich decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== und es druckt Aladdin:open sesame und kehrt zur Eingabeaufforderung zurück.

Bisher habe ich eine einfache bash-Datei ausprobiert python -m base64 -d $1 aber dieser Befehl erwartet einen Dateinamen, nicht eine Zeichenkette. Gibt es einen anderen nicht interaktiven Befehl (nicht unbedingt in einem Python-Modul), den ich von der Befehlszeile aus ausführen kann, ohne dass dazu zusätzliche Pakete installiert werden müssen? (Oder wenn ich etwas Superminimales mache.)


319
2017-08-21 12:17


Ursprung




Antworten:


Benutze einfach die base64 Programm von der coreutils Paket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Oder, um das Newline-Zeichen einzufügen

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

Ausgabe (enthält Newline):

Aladdin:open sesame

483
2017-08-21 13:34



Oder: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Oder: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Unter Windows mit gits base64. - Fire
@ Januar Es ist nicht Just use, weil viele Leute über das wissen base64 Programm - aber wie man nicht kann gerade Wenn Sie eine Zeichenfolge als Befehlszeilenoption einfügen, ist es schwierig, die Syntax für Benutzer zu verwenden, die die CLI nur gelegentlich berühren. - feeela
Kopieren Sie auf dem Mac die codierte Zeichenfolge in die Zwischenablage und führen Sie sie aus pbpaste | base64 --decode. - Marián Černý


openssl kann auch base64 codieren und dekodieren

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

EDIT: Ein Beispiel, in dem die Base64-codierte Zeichenfolge in mehreren Zeilen endet:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'
QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
$ openssl enc -base64 -d << EOF
> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
> EOF
And if the data is a bit longer, the base64 encoded data will span multiple lines.

75
2017-08-21 22:23



Dank Philippes Antwort müssen Sie -A für lange base64 Strings hinzufügen, sonst wird openssl nichts zurückgeben, siehe askubuntu.com/a/271676/305568 - morloch
@ Morloch oder einfach vermeiden, die Zeilenumbrüche aus den Base64-codierten Daten zu entfernen, und es funktioniert wie erwartet ... - geirha
Ich würde nicht darüber nachdenken coreutils ein "zusätzliches" Paket mit Programmen wie ls, mkdir, cp, mv, und chmod. Ich bezweifle, dass Sie ohne Ihre Maschine etwas Nützliches mit Ihrer Maschine machen können. - vidstige
@vidstich, das stimmt. Ich weiß nicht, warum ich den Eindruck hatte, dass base64 nicht standardmäßig installiert war. das ist völlig nicht der Fall. - geirha
Während das ist der Ubuntu Stack Exchange, mit openssl hat gegenüber Standard den Vorteil base64 in Git Bash unter Windows zu arbeiten, zumindest die ältere 1.8.1 Git Bash Version, die ich installiert habe. - willkil


Bitte schön!

Fügen Sie Folgendes an den unteren Rand Ihres ~/.bashrc Datei:

decode () {
  echo "$1" | base64 -d ; echo
}

Öffnen Sie nun ein neues Terminal und führen Sie den Befehl aus.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Dies wird genau das tun, was Sie in Ihrer Frage verlangt haben.


32
2017-08-21 13:39





Bei Ihren ursprünglichen Abhängigkeiten können Sie dies mit einer kleinen Änderung an Ihrem ursprünglichen Skript tun:

echo $1 | python -m base64 -d

Wenn Sie keinen Dateinamen übergeben, liest dieses Python-Modul die Standardeingabe. Um den ersten Parameter dorthin zu leiten, können Sie verwenden echo $1 |.


18
2017-10-05 12:15



Außerdem: python -m base32 Dateiname - kenorb
das funktioniert nicht :) aber verwenden .b32 * Methoden - rzr


Ich habe die base64-Befehlszeile eingegeben http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Daher gebe ich eine Warnung aus, wenn ich die openssl base64-Decodierung verwende:

 openssl base64 -e <<< 'Welcome to openssl wiki'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

Warnung Die Länge der Base64-Zeile ist in openssl standardmäßig auf 64 Zeichen begrenzt :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

=> NICHTS!

Um eine Base64-Zeile ohne Zeilenvorschub zu dekodieren, die 64 Zeichen überschreitet, verwenden Sie die Option -A:

openssl base64 -d -A <<<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

Welcome to openssl wiki with a very long line that splits...

Dies ist sowieso besser, um das Base64-Ergebnis in Zeilen mit 64 Zeichen zu teilen, da die Option-BUGGY ist (Limit mit langen Dateien).


12
2018-03-23 18:23



@Seth bitte setze die Blöcke korrekt zurück, dein Befehl fusioniert den openssl Befehl mit meinen verschachtelten Kommentaren. - philippe lhardy
Kannst du das Reparieren? Ich kann nicht zwischen den beiden unterscheiden ... Ich werde es versuchen, aber du musst mir vielleicht helfen ;-) - Seth♦
naja, schau einfach mal rein wiki.opensslfoundation.com/... wo es mir gelungen ist, die wiki syntax besser zu benutzen (suche bas64 auf dieser Seite). - philippe lhardy


Verwenden perl

perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Oder das Gleiche mit python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

4
2017-07-02 20:22





Nur um einen anderen Weg hinzuzufügen:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'

2
2018-06-15 06:27