Comment décoder une chaîne base64 à partir de la ligne de commande?

316

Je voudrais écrire un script bash pour décoder une chaîne base64. Par exemple, je tape decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== et affiche Aladdin:open sesame et retourne à l'invite.

Jusqu'à présent, j'ai essayé un simple fichier bash contenant python -m base64 -d mais cette commande attend un nom de fichier, pas une chaîne. Existe-t-il une autre commande non interactive (pas nécessairement dans un module Python) que je peux exécuter depuis la ligne de commande pour y parvenir, sans avoir à installer de paquetages supplémentaires? (Ou si je le fais, quelque chose de super minimal.)

    
posée d3vid 21.08.2012 - 14:17
la source

7 réponses

474

Utilisez simplement le programme base64 du package coreutils :

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Ou, pour inclure le caractère de nouvelle ligne

echo 'echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode'

sortie (inclut la nouvelle ligne):

Aladdin:open sesame
    
réponse donnée January 21.08.2012 - 15:34
la source
74

openssl peut également encoder et décoder base64

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

EDIT: Un exemple où la chaîne codée en base64 aboutit sur plusieurs lignes:

$ 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.
    
réponse donnée geirha 22.08.2012 - 00:23
la source
32

Voilà!

Ajoutez ce qui suit au bas de votre fichier ~/.bashrc :

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

Maintenant, ouvrez un nouveau terminal et exécutez la commande.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Cela fera exactement ce que vous avez demandé dans votre question.

    
réponse donnée SirCharlo 21.08.2012 - 15:39
la source
18

Avec vos dépendances d'origine, il est possible de le faire avec une modification mineure de votre script d'origine:

echo  | python -m base64 -d

Si vous ne passez pas un nom de fichier, ce module python lit à partir de l’entrée standard. Pour y insérer le premier paramètre, vous pouvez utiliser echo | .

    
réponse donnée AmanicA 05.10.2012 - 14:15
la source
12

J'ai commenté la ligne de commande base64 dans lien . Donc, je lance un avertissement lors de l'utilisation du décodage openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

l'avertissement la longueur de la ligne base64 est limité à 64 caractères par défaut dans openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

= & gt; RIEN!

pouvoir décoder une ligne de base 64 sans saut de ligne dépassant 64 caractères avec l'option -A:

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

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

Il est préférable d’augmenter le résultat de base 64 en 64 caractères, car l’option -A est BUGGY (limite pour les fichiers longs).

    
réponse donnée philippe lhardy 23.03.2013 - 19:23
la source
4

Utilisation de perl

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

Ou la même chose avec python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
    
réponse donnée A.B. 02.07.2015 - 22:22
la source
2

Juste pour ajouter une autre façon de le faire:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
    
réponse donnée erjoalgo 15.06.2016 - 08:27
la source

Lire d'autres questions sur les étiquettes