Question 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 decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== et il imprime Aladdin:open sesame et retourne à l'invite.

Jusqu'à présent, j'ai essayé un simple fichier bash 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 depuis la ligne de commande pour y parvenir, sans avoir à installer de paquetages supplémentaires? (Ou si je le fais, quelque chose de super minimal.)


319
2017-08-21 12:17


origine




Réponses:


Il suffit d'utiliser le base64 programme de la coreutils paquet:

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

483
2017-08-21 13:34



Ou: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Ou: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Sous Windows avec la base de git64. - Fire
@January Ce n'est pas Just use, parce que beaucoup de gens connaissent le base64 programme - mais comme on ne peut pas juste insérez une chaîne en tant qu'option de ligne de commande, il est difficile d'obtenir la syntaxe correcte pour les utilisateurs qui ne touchent le CLI que de temps en temps. - feeela
Sur Mac, copiez la chaîne encodée dans le presse-papier et exécutez pbpaste | base64 --decode. - Marián Černý


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 codé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.

75
2017-08-21 22:23



Grâce à la réponse de Philippe, vous devez ajouter -A pour les longues chaînes de base64, sinon openssl ne renverra rien, voir askubuntu.com/a/271676/305568 - morloch
@morloch ou évitez simplement de supprimer les nouvelles lignes des données encodées en base64 et cela fonctionne comme prévu ... - geirha
Je ne considérerais pas coreutils un paquet "additionnel" contenant des programmes comme ls, mkdir, cp, mv, et chmod. Je doute que vous puissiez faire quelque chose d'utile avec votre machine sans elle. - 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
Bien que ce soit l’échange de pile Ubuntu, en utilisant openssl a l'avantage sur la norme base64 de travailler avec Git Bash sous Windows, au moins l'ancienne version 1.8.1 de Git Bash que j'ai installée. - willkil


Voici!

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

decode () {
  echo "$1" | base64 -d ; echo
}

Ouvrez maintenant un nouveau terminal et exécutez la commande.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Cela fera exactement ce que vous avez demandé dans votre question.


32
2017-08-21 13:39





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 passez pas un nom de fichier, ce module python lit à partir de l'entrée standard. Pour y insérer le premier paramètre, vous pouvez utiliser echo $1 |.


18
2017-10-05 12:15



Aussi: python -m nomfichier32 - kenorb
cela ne fonctionne pas :) mais utilisez les méthodes .b32 * - rzr


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

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

Attention 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 qui utilise 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...

Il est préférable de mettre à jour le résultat de base64 en 64 caractères, car l'option -A est BUGGY (limite pour les fichiers longs).


12
2018-03-23 18:23



@Seth s'il vous plaît réinitialiser les blocs correctement, votre commande openssl edit fusionné avec mes commentaires entrelacés. - philippe lhardy
Peux-tu le réparer? Je ne peux pas différencier les deux ... Je vais essayer, mais vous devrez peut-être m'aider ;-) - Seth♦
il suffit de jeter un oeil sur wiki.opensslfoundation.com/… où j'ai réussi à mieux utiliser la syntaxe wiki (recherchez bas64 dans cette page). - philippe lhardy


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=="

4
2017-07-02 20:22





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

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

2
2018-06-15 06:27