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 retourne à l'invite de commande.

Jusqu'à présent, j'ai essayé un fichier bash simple contenant python -m base64 -d $1 mais cette commande 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 à partir de la ligne de commande pour y parvenir, sans avoir à installer de packages supplémentaires ? (Ou si je dois en installer, quelque chose de super-minimal.)

1 votes

Belle question. Et merci pour ton conseil, 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 le 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 Sur Windows avec le base64 de git.

115voto

Steve Karg Points 11

Openssl peut également coder et décoder en base64

$ openssl enc -base64 <<< 'Bonjour, le monde!'
U0dWc2JHOCxJRkRvcmNselEvCg==
$ openssl enc -base64 -d <<< U0dWc2JHOCxJRkRvcmNselEvCg==
Bonjour, le monde!

EDIT: Un exemple où la chaîne encodée en base64 se retrouve sur plusieurs lignes :

$ openssl enc -base64 <<< 'Et si les données sont un peu plus longues, les données encodées en base64 occuperont plusieurs lignes.'
UW41a0lHbFpNRG9Sb0psbGVzIFRvemIgaW5nIFJlYW0gdXRuIHJvdWtsbmlzLCBsZXMgZGFuZGFzIGVuIGJhc2U2NCBvY2N1cGVyb3dudCBwbHVlc2xpcmUgbGluZ2VzLgo=
$ openssl enc -base64 -d << EOF
> UW41a0lHbFpNRG9Sb0psbGVzIFRvemIgaW5nIFJlYW0gdXRuIHJvdWtsbmlzLCBsZXMgZGFuZGFzIGVuIGJhc2U2NCBvY2N1cGVyb3dudCBwbHVlc2xpcmUgbGluZ2VzLgo=
> EOF
Et si les données sont un peu plus longues, les données encodées en base64 occuperont plusieurs lignes.

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 "supplémentaire" contenant des programmes comme ls, mkdir, cp, mv et chmod. Je doute que vous puissiez faire quelque chose 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 légère modification de votre script original :

echo $1 | python -m base64 -d

Si vous ne passez pas de nom de fichier, ce module python lit à partir de l'entrée standard. Pour envoyer le premier paramètre dedans, 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 sur http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Donc je lance une mise en garde lors de l'utilisation du décodage base64 d'openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Bienvenue sur le wiki openssl

avertissement la longueur de la 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...

Il est quand même préférable de diviser le résultat base64 en lignes de 64 caractères étant donné que l'option -A est boguée (limite avec les fichiers longs).

0 votes

La documentation du 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