572 votes

Comment puis-je 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 décoder QWxhZGRpbjpvcGVuIHNlc2FtZQ== et cela affiche Aladdin:open sesame et revient à l'invite de commande.

Jusqu'à présent, j'ai essayé un simple fichier bash contenant python -m base64 -d $1 mais cette commande s'attend à un nom de fichier et non une chaîne. Y a-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 besoin d'installer des paquets supplémentaires? (Ou si nécessaire, quelque chose de super-minimal.)

1 votes

Belle question. Et merci pour votre suggestion, je sais maintenant que le python -m base64 -h peut être utile.

835voto

January Points 33673

Il suffit d'utiliser le programme base64 du package coreutils:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Ou, pour inclure le caractère de saut de ligne

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

sortie (inclut un saut de ligne):

Aladdin:open sesame

10 votes

Ou : echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode && echo

95 votes

Ou : base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==

4 votes

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Sous Windows avec le base64 de git.

115voto

Steve Karg Points 11

Openssl peut également coder et décoder en 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 retrouve 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.

10 votes

Grâce à la réponse de Philippe, vous devez ajouter -A pour les longues chaînes base64 sinon openssl ne renverra rien, voir askubuntu.com/a/271676/305568

0 votes

@morloch ou simplement éviter de supprimer les sauts de ligne des données encodées en base64, et cela fonctionne comme prévu...

1 votes

Je ne considérerais pas coreutils comme un package "additionnel" contenant des programmes comme ls, mkdir, cp, mv et chmod. Je doute que vous puissiez faire quoi que ce soit d'utile avec votre machine sans lui.

47voto

SirCharlo Points 37508

Voici!

Ajoutez ce qui suit en 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.

22voto

Steadicat Points 315

Avec vos dépendances originales, il est possible de faire cela avec une modification mineure de votre script original :

echo $1 | python -m base64 -d

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

1 votes

Aussi: python -m base32 nom_fichier

1 votes

Cela ne fonctionne pas :) mais utilisez les méthodes .b32*

17voto

user154321 Points 153

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

 openssl base64 -e <<< 'Bienvenue sur le wiki openssl'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Bienvenue sur le wiki openssl

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

 openssl base64 -e <<< 'Bienvenue sur le wiki openssl avec une ligne très longue
 qui se divise...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

\=> RIEN !

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

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

Bienvenue sur le wiki openssl avec une ligne très longue qui se divise...

Quoi qu'il en soit, il est préférable de réellement diviser le résultat base64 en lignes de 64 caractères puisque l'option -A est buggy (limitation avec les fichiers longs).

0 votes

La documentation wiki d'OpenSSL a été déplacée ici wiki.openssl.org/index.php/… puis une réécriture a perdu cette utilisation de -A et les limites de 64 caractères.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X