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.)

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

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.

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.


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


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.


4

Verwenden perl

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

Oder das selbe mit python

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

2

Nur um einen anderen Weg hinzuzufügen:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.