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.)
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
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.
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.
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 |
.
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).
Utiliser Perl
Perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
Ou la même chose avec python
python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
Juste pour ajouter une autre façon de le faire:
emacs -Q --batch -eval '(princ (base64-encode-string (read-string ": ")))'