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

426

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

Jusqu'à présent, j'ai essayé un fichier bash simple contenant, python -m base64 -d $1mais cette commande attend un nom de fichier et non 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.)

david.libremone
la source

Réponses:

630

Il suffit d'utiliser le base64programme du coreutilspaquet:

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
janvier
la source
10
Ou: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Greg Chabala
61
Ou:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Jmk
4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtSur Windows avec la base64 de git.
Incendie
3
@January Cela n’est pas le cas Just use, car de nombreuses personnes connaissent le base64programme - mais comme on ne peut pas simplement insérer une chaîne comme option de ligne de commande, il est difficile d’obtenir la syntaxe correcte pour les utilisateurs qui ne touchent la CLI que de temps en temps.
feeela
12
Sur Mac, copiez la chaîne encodée dans le presse-papiers et exécutez-la pbpaste | base64 --decode.
Commentaires
95

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.
geirha
la source
8
Grâce à la réponse de Philippe, vous devez ajouter -A pour les chaînes longues de base64, sinon OpenSSL ne renverra rien, voir askubuntu.com/a/271676/305568
morloch
@morloch ou évitez simplement de supprimer les retours à la ligne des données encodées en base64, et cela fonctionne comme prévu ...
geirha
1
Je ne considère pas coreutilsun paquet « supplémentaire » contenant des programmes tels que ls, mkdir, cp, mvet chmod. Je doute que vous puissiez faire quelque chose d’utile avec votre machine sans cela.
vidstige
@vidstige, c'est vrai. Je ne sais pas pourquoi j'avais l'impression que base64 n'était pas installé par défaut. ce n'est absolument pas le cas.
geirha
1
Bien qu'il s'agisse de l'échange de pile ubuntu, l'utilisation opensslprésente l'avantage base64de fonctionner sous Git Bash sous Windows par rapport à la version standard , à tout le moins l'ancienne version 1.8.1 Git Bash que j'ai installée.
willkil
38

Voici!

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

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.

SirCharlo
la source
20

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. Vous pouvez utiliser le premier paramètre pour y accéder echo $1 |.

AmanicA
la source
1
Aussi: python -m base32 nomfichier
kenorb
1
cela ne fonctionne pas :) mais utilisez les méthodes .b32 *
rzr
13

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

La longueur de la ligne d' avertissement 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...

En tout état de cause, il est préférable de scinder le résultat en base64 en 64 caractères car l’option -A est BUGGY (limite pour les fichiers longs).

Philippe Hardy
la source
4

En utilisant perl

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

Ou la même chose avec python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
UN B
la source
2

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

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