Wie kann ich einen base64-String von der Kommandozeile dekodieren?

426

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

Bisher habe ich eine einfache Bash-Datei ausprobiert, die python -m base64 -d $1jedoch einen Dateinamen und keine Zeichenfolge erwartet. Gibt es einen anderen nicht interaktiven Befehl (nicht unbedingt in einem Python-Modul), den ich über die Befehlszeile ausführen kann, um dies zu erreichen, ohne zusätzliche Pakete installieren zu müssen? (Oder wenn ich es tue, etwas Super-Minimales.)

david.libremone
quelle

Antworten:

630

Verwenden Sie einfach das base64Programm aus dem coreutilsPaket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Oder, um das Zeilenumbruchzeichen einzuschließen

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

Ausgabe (einschließlich Zeilenvorschub):

Aladdin:open sesame
Januar
quelle
10
Oder: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode & & echo
Greg Chabala
61
Oder:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk
4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtUnter Windows mit gits base64.
Feuer
3
@Januar Das ist nicht der Fall Just use, da viele Leute mit dem base64Programm vertraut sind - aber da man nicht einfach eine Zeichenfolge als Befehlszeilenoption einfügen kann , ist es für Benutzer, die die CLI nur gelegentlich berühren, schwierig, die richtige Syntax zu finden.
Feeela
12
Kopieren Sie auf einem Mac die codierte Zeichenfolge in die Zwischenablage und führen Sie sie aus pbpaste | base64 --decode.
Marián Černý
95

openssl kann base64 auch codieren und decodieren

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

BEARBEITEN: Ein Beispiel, in dem der base64-codierte String 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.
geirha
quelle
8
Dank Philippe Antwort, müssen Sie -Eine lange Base64 - Strings hinzufügen sonst openssl gibt nichts zurück, 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
1
Ich würde nicht als coreutilsein „zusätzliches“ Paket mit Programmen wie ls, mkdir, cp, mv, und chmod. Ich bezweifle, dass Sie ohne Ihre Maschine etwas Nützliches tun können.
15.
@vidstige, das stimmt. Ich weiß nicht, warum ich den Eindruck hatte, dass base64 nicht standardmäßig installiert wurde. das ist absolut nicht der fall.
Geirha
1
Dies ist zwar der Ubuntu-Stapelaustausch, die Verwendung opensslhat jedoch den Vorteil, dass base64sie in Git Bash unter Windows funktioniert, zumindest in der älteren Version 1.8.1 Git Bash, die ich installiert habe.
Willkil
38

Bitte schön!

Fügen Sie am Ende Ihrer ~/.bashrcDatei Folgendes hinzu :

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 gefragt haben.

SirCharlo
quelle
20

Bei Ihren ursprünglichen Abhängigkeiten ist dies mit einer geringfügigen Änderung Ihres ursprünglichen Skripts möglich:

echo $1 | python -m base64 -d

Wenn Sie keinen Dateinamen übergeben, liest das Python-Modul von der Standardeingabe. Um den ersten Parameter einzugeben, können Sie verwenden echo $1 |.

AmanicA
quelle
1
Außerdem: Python -m Base32-Dateiname
Kenorb
1
das funktioniert nicht :) aber benutze .b32 * Methoden
rzr
13

Ich habe die base64-Befehlszeile in http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities kommentiert . Deshalb gebe ich eine Warnung aus, wenn ich OpenSSL Base64-Dekodierung verwende:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

In openssl ist die Zeilenlänge von base64 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 mit mehr als 64 Zeichen zu dekodieren, verwenden Sie die Option -A:

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

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

Dies ist ohnehin besser, um das base64-Ergebnis in 64-Zeichen-Zeilen aufzuteilen, da die Option -A auf BUGGY (Limit bei langen Dateien) gesetzt ist.

philippe lhardy
quelle
4

Verwenden perl

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

Oder das selbe mit python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
quelle
2

Nur um einen anderen Weg hinzuzufügen:

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