web-dev-qa-db-fra.com

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

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

Jusqu'ici, j'ai essayé un fichier bash simple contenant python -m base64 -d $1 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 à partir de la ligne de commande pour cela, sans avoir à installer de paquet supplémentaire? (Ou si je le fais, quelque chose de super-minimal.)

398
david.libremone

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
587
January

openssl peut aussi 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 encodée en base64 se termine 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.
90
geirha

Voici!

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

decode () {
  echo "$1" | 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.

38
SirCharlo

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

echo $1 | python -m base64 -d

Si vous ne transmettez pas un nom de fichier, ce module python lit à partir de l'entrée standard. Pour y diriger le premier paramètre, vous pouvez utiliser echo $1 |.

20
AmanicA

J'ai commenté la ligne de commande base64 dans http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Je lance donc un avertissement lors de l’utilisation du décodage openssl en base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

warning La longueur de la ligne base64 est limitée à 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=='

=> RIEN!

pour pouvoir décoder une ligne base64 sans saut de ligne de plus de 64 caractères, utilisez l'option -A:

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

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

De toute façon, il est préférable de scinder le résultat en base64 en lignes de 64 caractères, car l'option -A est BUGGY (limite pour les fichiers longs).

12
philippe lhardy

Utiliser Perl

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

Ou la même chose avec python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
4
A.B.

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

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