Hoe codeer je base64 via de opdrachtregel?
Is er een terminalopdracht in Mac OS X die een bestand of stdin zal coderen op basis64?
Is er een terminalopdracht in Mac OS X die een bestand of stdin zal coderen op basis64?
openssl
kan dit voor u doen, en het is allemaal standaard geïnstalleerd met OS X; het is niet nodig om darwinports te installeren.
$ openssl base64 -in <infile> -out <outfile>
Zonder de -in
optie leest u van stdin
Probeer het met:
base64 -i <in-file> -o <outfile>
Het zou standaard beschikbaar moeten zijn op OS X.
Aangezien Python standaard is voorzien van OS X, kunt u het als volgt gebruiken:
$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO
of installeer coreutils
via Brew (brew install coreutils
) die de opdracht base64
geeft:
$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
In termen van snelheid zou ik openssl gebruiken, gevolgd door perl, gevolgd door uuencode. In termen van overdraagbaarheid zou ik uuencode gebruiken, gevolgd door Perl, gevolgd door openssl (als je er belang aan hecht om de code te hergebruiken op zoveel mogelijk andere UNIX-achtige voorraadplatforms). Wees echter voorzichtig want niet alle UNIX varianten ondersteunen de -m switch (iirc AIX wel, HP/UX wel, Solaris niet).
$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real 0m0.025s
$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real 0m0.051s
$ time openssl base64 -in out.jpg -out filename.b64
real 0m0.017s
Gebruik de -m switch naar uuencode bestand_in. txt per base64 zoals gespecificeerd door RFC1521 en schrijf het naar filenaam.b64 (met filenaam_uudecoded.txt als standaard filenaam wanneer gedecodeerd):
uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt
STDIN voorbeeld:
cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
Python komt tegenwoordig op alle macs voorgeïnstalleerd.
In Terminal run python
(of ipython ).
Codeer een bestand:
base64data = open('myfile.jpg','rb').read().encode('base64')
open('myfile.txt','w').write(base64data)
Decodeer een bestand:
data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)
Natuurlijk kunnen beide bewerkingen worden geconverteerd naar een oneliner maar op deze manier is het beter leesbaar.
## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64
## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64
## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg
## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg
Het weglaten van de -out
/-output... filename
zal een stdout afdrukken.
Een andere ootb utility die zowel in OSX als in Ubuntu aanwezig is:
## encode to base64
base64 < myfile.jpg > myfile.jpg.b64
## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg
## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg
Om een of andere reden heeft echo -n <data> | openssl base64
een nieuwe lijn toegevoegd in het midden van mijn basis64 gegevens. Ik neem aan dat het was omdat mijn base64 data erg lang was.
Het gebruik van echo -n <data> | base64
om te coderen en echo -n <base64-ed data> | base64 -D
om te decoderen werkte prima.
uuencode -m [-o output_file] [file] name
waarbij naam de naam is die in de gecodeerde koptekst moet worden weergegeven.
Voorbeeld:
cat docbook-xsl.css | uuencode -m docbook-xsl.css
of
uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
In aanvulling op Steve Folly’s antwoord hierboven, drukt u bij het coderen in stdin-modus, om te voorkomen dat er extra nieuwe regels worden doorgegeven, twee keer op CTRL+D om de invoer te beëindigen zonder extra nieuwe regels. De uitvoer wordt direct na dezelfde regel weergegeven.
Bijvoorbeeld:
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$
Als alternatief kunt u printf
gebruiken:
$ printf 'input' | openssl base64
aW5wdXQ=
$
Er is Perl plus MIME::Base64:
perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'
Dit wordt voorgeïnstalleerd. U kunt afzonderlijke bestanden op de commandoregel opgeven (of de gegevens op de standaardinvoer aanleveren); elk bestand wordt afzonderlijk gecodeerd. Je kunt ook doen:
perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1
Dit maakt een back-up van bestand1 naar bestand1.txt, en schrijft de Base-64 gecodeerde uitvoer over het originele bestand.
Als je base64 een lettertypebestand codeert, kan je dit doen:
base64 my-webfont.ttf > my-webfont.b64.ttf.txt
Ik gebruik dit de hele tijd op een Mac (10.10).
Aanwijzing : Er zullen geen linebreaks zijn.
We hebben een lijst samengesteld van cross-platform shell commando’s om een bestand te coderen als basis64. De volgende commando’s nemen een invoerbestand (met de naam deploy.key
in voorbeelden) en converteren het naar base64 zonder newline wrapping. De uitvoer van base64 wordt naar de terminal geprint via stdout.
# For systems with openssl
openssl base64 -A -in=deploy.key
# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"
# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key
# For macOS systems
base64 --break=1000000 deploy.key
Om de uitvoer om te leiden naar een bestand, voeg > base64-encoded.txt
toe (met een bestandsnaam naar keuze).
Deze commando’s werden als onderdeel van deze pull request waarbij we cross-platform shell commando’s wilden laten coderen naar base64 en een SSH private key om nieuwe lijnen te verwijderen.