Vraag Hoe kan ik een base64-string decoderen vanaf de opdrachtregel?


Ik zou graag een bash-script willen schrijven om een ​​base64-string te decoderen. Ik typ bijvoorbeeld decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== en het drukt Aladdin:open sesame en keert terug naar de prompt.

Tot dusver heb ik een eenvoudig bash-bestand geprobeerd met python -m base64 -d $1 maar deze opdracht verwacht dat een bestandsnaam geen tekenreeks is. Is er een andere niet-interactieve opdracht (niet noodzakelijk in een Python-module) die ik kan uitvoeren vanaf de opdrachtregel om dit te bereiken, zonder extra pakketten te hoeven installeren? (Of als ik dat doe, iets super-minimaal.)


319
2017-08-21 12:17


oorsprong




antwoorden:


Gebruik gewoon de base64 programma van de coreutils pakket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Of om het nieuwelijnteken op te nemen

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

uitvoer (inclusief newline):

Aladdin:open sesame

483
2017-08-21 13:34



Of: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Of: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Op Windows met git's base64. - Fire
@ Januari Het is het niet Just use, omdat veel mensen weten van de base64 programma - maar zoals iemand dat niet kan net voeg een tekenreeks in als opdrachtregeloptie, het is moeilijk om de syntaxis te gebruiken voor gebruikers die de CLI slechts eenmaal in de zoveel tijd aanraken. - feeela
Op de Mac kopieert u de gecodeerde string naar het klembord en voert u deze uit pbpaste | base64 --decode. - Marián Černý


openssl kan ook base64 coderen en decoderen

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

EDIT: een voorbeeld waarbij de base64-gecodeerde string op meerdere regels terechtkomt:

$ 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



Dankzij het antwoord van Philippe moet je - A voor lange base64-strings toevoegen, anders opent openssl niets. Zie? askubuntu.com/a/271676/305568 - morloch
@morloch of vermijd gewoon het verwijderen van de newlines van de base64-gecodeerde data, en het werkt zoals verwacht ... - geirha
Ik zou niet overwegen coreutils een "aanvullend" pakket met programma's zoals ls, mkdir, cp, mv, en chmod. Ik betwijfel of je iets nuttigs met je machine kunt doen zonder. - vidstige
@vidstige, dat is waar. Ik weet niet waarom ik de indruk had dat base64 niet standaard was geïnstalleerd; dat is helemaal niet het geval. - geirha
Hoewel dit de ubuntu stack-uitwisseling is, gebruikt openssl heeft het voordeel ten opzichte van standaard base64 van het werken in Git Bash op Windows, tenminste de oudere 1.8.1 Git Bash-versie die ik heb geïnstalleerd. - willkil


Alsjeblieft!

Voeg het volgende toe aan de onderkant van uw ~/.bashrc het dossier:

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

Open nu een nieuwe terminal en voer de opdracht uit.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Dit zal precies doen wat je vroeg in je vraag.


32
2017-08-21 13:39





Met uw originele afhankelijkheden is het mogelijk om dit te doen met een kleine aanpassing aan uw oorspronkelijke script:

echo $1 | python -m base64 -d

Als u geen bestandsnaam doorgeeft, leest die pythonmodule uit van de standaardinvoer. Om de eerste parameter erin te pipen, kunt u gebruiken echo $1 |.


18
2017-10-05 12:15



Ook: python -m base32 bestandsnaam - kenorb
dit werkt niet :) maar gebruik de .b32 * -methoden - rzr


Ik heb de opdrachtregel van base64 opgegeven http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Dus ik geef een waarschuwing bij gebruik van openssl base64-decodering:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

waarschuwing basis64 regellengte is standaard beperkt tot 64 tekens in openssl :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

=> NIETS!

om een ​​base64-regel te kunnen decoderen zonder een regelinvoer die 64 tekens overschrijdt, gebruikt u -A optie:

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

Welcome to openssl wiki with a very long line that splits...

Dit is sowieso beter om feitelijk het base64-resultaat te delen in regels van 64 tekens - Een optie is BUGGY (limiet bij lange bestanden).


12
2018-03-23 18:23



@Seth alsjeblieft stel blokken correct opnieuw in, je bewerk samengevoegde openssl-opdracht met mijn verweven opmerkingen. - philippe lhardy
Kun je het maken? Ik kan geen onderscheid maken tussen de twee ... ik zal het proberen, maar misschien moet je me helpen ;-) - Seth♦
maar moet gewoon even kijken wiki.opensslfoundation.com/... waar ik wiki-syntaxis beter kon gebruiken (zoek bas64 op deze pagina). - philippe lhardy


Gebruik makend van perl

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

Of hetzelfde met python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

4
2017-07-02 20:22





Gewoon om een ​​andere manier toe te voegen om het te doen:

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

2
2018-06-15 06:27