Comment encoder base64 en ligne de commande?

217

Existe-t-il une commande de terminal sous Mac OS X qui va coder en base64 un fichier ou stdin?

Josh
la source
5
Sachez que même si la syntaxe base64 codant est cohérente d'un OS à l' autre, la syntaxe base64-décodage est soit base64 -dou en base64 -Dfonction de votre système d'exploitation. OSX utilise -D.
Chris Johnson
@ChrisJohnson Si utilisé de concert avec opensslle drapeau pour le décodage est -dsur OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Réponses:

232

opensslpeut le faire pour vous, et tout est installé avec OS X par défaut; pas besoin d'installer darwinports.

$ openssl base64 -in <infile> -out <outfile>

Sans l' -inoption lit stdin

Steve Folly
la source
79
Utilisez openssl base64 < path/to/file.png | tr -d '\n' | pbcopyou cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopypour ignorer l'écriture dans un fichier et copiez simplement la sortie codée en base64 dans le Presse-papiers sans les sauts de ligne.
Mathias Bynens le
3
Et utilisez un -ddrapeau pour décoder.
Kenny
5
Sous mac, Pour coder en base64 une chaîne: openssl base64 -e <<< ramet à décoder:openssl base64 -d <<< cmFtCg==
Ram Patra
8
@mathias si vous ne voulez pas de nouvelles lignes le openssl base64 [-e] -Afait. + @kenny on decode si l'entrée n'a pas de nouvelle ligne tous les 76 caractères au plus, y compris le cas de non-nouvelle ligne que je viens d'énoncer, vous avez besoin -d -Aou vous obtiendrez des données manquantes ou corrompues sans message d'erreur (bien qu'un rapport de bogue en attente peut résulter en un correctif à cela).
dave_thompson_085
2
@Ram, openssl base64 -e <<< ramcode actuellement 4 octets, y compris un saut de ligne final ; voir hexdump <<< ram.
Arjan
93

Openssl peut être utilisé de manière plus succincte:

echo -n 'input' | openssl base64

[echo -n -> doit être utilisé, sinon l'encodage sera effectué avec un nouveau caractère de ligne]

ou

openssl base64 <ENTER> [type input] <CTRL+D>
Glen
la source
10
La solution "echo" ajoute cependant un caractère LF (saut de ligne) à la fin de la chaîne d'entrée. Meilleure utilisation: echo -n 'input'
SuperTempel
8
Et même un peu plus succinctopenssl base64 <<< input
Garrett Fogerlie
2
Ou simplement utiliser base64sans openssl. Quoi qu'il en soit, je dois appuyer deux fois sur Ctrl + D. Et méfiez - vous, @Garret: Bash, avec ou sans openssl, openssl base64 <<< superuseret à openssl base64 <<< "superuser" tort céder c3VwZXJ1c2VyCg==, comme le « ici chaîne » comprend alors encore un saut de ligne! ( Apparemment, pas seulement dans Bash, mais aussi dans zsh, ksh et yash. Voir hexdump <<< superuser. Le résultat en Base64 devrait être c3VwZXJ1c2Vy.)
Arjan
@ Arjan J'hésiterais à utiliser le mot "par erreur" - comme vous l'avez fait remarquer, la chaîne here inclut un saut de ligne, mais pour une bonne raison - unix.stackexchange.com/questions/20157/… . echo -nest préférable si vous n'avez pas besoin de la nouvelle ligne. C'est certainement quelque chose à prendre en compte.
Steve Folly
2
Vous pouvez utiliser printfà la place deecho -n
Jason S
50

Essayez d'utiliser:

base64 -i <in-file> -o <outfile>

Il devrait être disponible par défaut sur OS X.

Derreck Dean
la source
1
Ajouter --decodepour inverser le processus de base64 à la normale.
LuckyDonald
1
C'est mieux pour l'encodage pour SVG car cela crée une ligne. Ceci est plus propre que la sortie de openssl base64. Merci!
Shanimal
32

base64 Cette commande est disponible par défaut sur mon OS X 10.9.4.

Vous pouvez utiliser base64 <<< stringet base64 -D <<< stringpour coder et décoder une chaîne dans le terminal, ou base64 -in fileet base64 -D -in filepour coder et décoder un fichier.

WKPlus
la source
Avez-vous un exemple? Je reçois Invalid characer in input streamlors de l'utilisation <<<... J'ai essayé avec ", 'et rien autour de la chaîne.
Jonas
@ Jonas Dans quelle coquille es-tu? Vous pouvez l'utiliser dans bash et zsh.
WKPlus
Ah, tant pis, ça marche!
Jonas
8

Python étant fourni avec OS X par défaut, vous pouvez l’utiliser comme suit:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

Ou installez coreutilsvia Brew ( brew install coreutils) qui fournira la base64commande:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
Kenorb
la source
6

Sur macOS, j'utilise toujours:

echo -n "STRING" | base64

-n est d'éviter un nouveau caractère de ligne à la fin de la ligne.

patrickS
la source
5

En termes de vitesse, j'utiliserais openssl suivi de perl, suivi de uuencode. Pour ce qui est de la portabilité, j'utiliserais uuencode suivi de Perl suivi de openssl (si vous tenez à ce que le code soit réutilisé sur autant d'autres plates-formes UNIX que stock, comme possible). Soyez prudent, car toutes les variantes UNIX ne prennent pas en charge le commutateur -m (iirc AIX, HP / UX, Solaris non).

$ 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

Utilisez le commutateur -m pour uuencode file_in.txt par base64 comme spécifié par RFC1521 et écrivez-le dans filename.b64 (avec filename_when_uudecoded.txt comme nom de fichier par défaut lors du décodage):

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

Exemple STDIN:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
binette
la source
5

Vous pouvez également le diriger vers le presse-papiers (au moins sur mac):

openssl base64 -in [filename] | pbcopy

Steve
la source
jouer au golf:base64 < [filename] | pbcopy
totels
3

Python

Python est préinstallé sur tous les macs de nos jours.

Dans Terminal Run python(ou ipython ).

Encoder un fichier:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

Décoder un fichier:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

Bien sûr, les deux opérations peuvent être converties en un seul élément, mais de cette manière, elles sont plus lisibles.

OpenSSL

## 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

Omettre le -out/ -output... filenameimprimera sur stdout.

base64

Un autre utilitaire ootb présent à la fois sous OSX et Ubuntu:

## 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
ccpizza
la source
2
uuencode -m [-o output_file] [file] name

nom est le nom à afficher dans l'en-tête codé.

Exemple:

cat docbook-xsl.css | uuencode -m docbook-xsl.css

ou

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
utilisateur214207
la source
uuencoden'est pas l'encodage en tant quebase64
ccpizza
2

Pour une raison quelconque, echo -n <data> | openssl base64ajouté une nouvelle ligne au milieu de mes données base64. Je suppose que c'était parce que mes données base64 étaient vraiment longues.

Utiliser echo -n <data> | base64pour encoder et echo -n <base64-ed data> | base64 -Ddécoder a bien fonctionné.

Frontières de la santé
la source
nb: sur mon nix, j'ai du utiliser -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55
2

En plus de la réponse de Steve Folly ci-dessus, lors du chiffrement en mode stdin, pour éviter de passer de nouvelles lignes, appuyez deux fois sur CTRL + D pour mettre fin à la saisie sans nouvelles lignes. La sortie s'affichera juste après la même ligne.

Par exemple:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

Alternativement, vous pouvez utiliser printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
grand
la source
1

Il y a Perl plus MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

Cela vient pré-installé. Vous pouvez spécifier des fichiers distincts sur la ligne de commande (ou fournir les données sur une entrée standard); chaque fichier est encodé séparément. Vous pouvez aussi faire:

perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1

Cela sauvegarde fichier1 dans fichier1.txt et écrit la sortie codée en base 64 sur le fichier d'origine.

Jonathan Leffler
la source
1

Une version simple de NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauve
la source
Je ne pense pas que ce soit une meilleure réponse car openssl(et maintenant base64), venez avec le système d'exploitation.
Josh
Au risque de couper les cheveux en quatre - et je suis consciente que cette critique s’applique également à quelques autres réponses - la question demandait comment coder un fichier ou stdin . Si je ne me trompe pas, votre réponse montre seulement comment encoder une chaîne.
G-Man
1

recode devrait faire l'affaire pour vous

recode ../b64 < file.txt > file.b64

recode est disponible pour OS X via MacPorts .

lourd
la source
Il n'y a rien intégré?
Josh
@Josh - il y a - openssl
Steve Folly
MacPorts ne vient pas avec aucune distribution OS X. Il y a beaucoup d'autres options qui font. Par exemple juste base64commander.
Jason S
1

Si vous codez en base64 un fichier de police, procédez comme suit:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

Je l'utilise sur un Mac (10.10) tout le temps.

Remarque : il n'y aura pas de sauts de ligne.

Chuck Ugwuh
la source
1

Solutions multiplateformes

Nous avons compilé une liste de commandes shell multiplates-formes pour coder un fichier en tant que base64. Les commandes suivantes prennent un fichier d’entrée (nommé deploy.keydans les exemples) et le convertissent en base64 sans le retour à la ligne. La sortie base64 est imprimée sur le terminal 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

Pour rediriger la sortie vers un fichier, ajoutez > base64-encoded.txt(en utilisant un nom de fichier de votre choix).

Ces commandes ont été prototypées dans le cadre de cette demande d'extraction, dans laquelle nous souhaitions que les commandes d'interconnexion multiplates-formes codent en base64 une clé privée SSH afin de supprimer les nouvelles lignes.

Daniel Himmelstein
la source