Come codificare base64 tramite la riga di comando?


180

Esiste un comando terminale in Mac OS X che codificherà in base64 a file o stdin?


5
Si noti che sebbene la sintassi di codifica base64 sia coerente da un sistema operativo a un altro, la sintassi di decodifica di base64 è base64 -d o base64 -D dipende dal tuo sistema operativo. OSX utilizza -D.
Chris Johnson

@ Chrisishnson Se usato in concerto con openssl la bandiera per la decodifica è -d su OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Risposte:


195

openssl puoi farlo per te, ed è tutto installato con OS X per impostazione predefinita; non è necessario installare darwinports.

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

Senza il -in opzione legge da stdin


71
Uso openssl base64 < path/to/file.png | tr -d '\n' | pbcopy o cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy per saltare la scrittura su un file e copiare l'output codificato in base 64 negli Appunti senza interruzioni di riga.
Mathias Bynens

1
E usare a -d contrassegno da decodificare.
kenny

5
In mac, Per base64 codificare una stringa: openssl base64 -e <<< ram e per decodificare: openssl base64 -d <<< cmFtCg==
Ram Patra

7
@mathias se non vuoi newline openssl base64 [-e] -A lo fa + @ kenny sulla decodifica se l'input non ha newline ogni 76 caratteri al massimo, incluso il caso no-newlines che ho appena detto, è necessario -d -A o otterrai dati mancanti o danneggiati senza messaggi di errore (anche se c'è una segnalazione di bug in sospeso che può portare a una correzione).
dave_thompson_085

2
@Ram, openssl base64 -e <<< ram in realtà codifica 4 byte, incluso un feed di riga finale; vedere hexdump <<< ram.
Arjan

68

Openssl può essere usato più succintamente:

echo -n 'input' | openssl base64

[echo -n - & gt; deve essere usato, o la codifica verrà eseguita incluso il carattere della nuova riga]

o

openssl base64 <ENTER> [type input] <CTRL+D>

9
La soluzione "echo" aggiunge un carattere LF (line feed) alla fine della stringa di input, però. Migliore utilizzo: echo -n 'input'
SuperTempel

6
E anche un po 'più conciso openssl base64 <<< input
Garrett Fogerlie

2
O semplicemente usa base64 senza openssl. Ad ogni modo, devo premere Ctrl + D due volte. E attenzione, @Garret: a Bash, con o senza openssl, openssl base64 <<< superuser e openssl base64 <<< "superuser" erroneamente dare la precedenza c3VwZXJ1c2VyCg==, poiché la "stringa qui" include ancora un avanzamento di riga! ( Apparentemente non solo in Bash, ma anche in zsh, ksh e yash. Vedere hexdump <<< superuser. Il risultato di Base64 dovrebbe essere c3VwZXJ1c2Vy.)
Arjan

@Arjan Esiterei ad usare la parola "erroneamente" - come hai sottolineato, la stringa qui presente include un avanzamento di riga, ma per una buona ragione - unix.stackexchange.com/questions/20157/... . echo -n è preferibile se non hai bisogno della nuova riga. È certamente qualcosa di cui essere a conoscenza.
Steve Folly

2
Potresti usare printf al posto di echo -n
Jason S

38

Prova a usare:

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

Dovrebbe essere disponibile per impostazione predefinita su OS X.


2
Grande. semplice ed elegante. Grazie!
Leon li

Inserisci --decode per invertire il processo da base64 a normale.
luckydonald

27

base64 il comando è disponibile di default sul mio OS X 10.9.4.

Puoi usare base64 <<< string e base64 -D <<< string codificare e decodificare una stringa nel terminale, o base64 -in file e base64 -D -in file per codificare e decodificare un file.


Hai un esempio? ottengo Invalid characer in input stream quando si usa <<<... ci ho provato ", ' e niente attorno alla corda.
Jonas

@ Jonas In che shell sei? Puoi usare questo in bash e zsh.
WKPlus

Ah, non importa, funziona!
Jonas

6

Poiché Python viene fornito con OS X per impostazione predefinita, puoi utilizzarlo come di seguito:

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

O installare coreutils attraverso infuso ( brew install coreutils ) che fornirà base64 comando:

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

5

In termini di velocità, userei openssl seguito da perl, seguito da uuencode. In termini di portabilità, userei uuencode seguito da Perl seguito da openssl (Se ti interessa riutilizzare il codice su quante più piattaforme di magazzino UNIX possibile). Attenzione però perché non tutte le varianti UNIX supportano l'opzione -m (iir AIX fa, HP / UX sì, Solaris no).

$ 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

Usa l'opzione -m per uuencode file_in.txt per base64 come specificato da RFC1521 e scriverlo su nomefile.b64 (con nomefile_when_uudecoded.txt come nome file predefinito quando decodificato):

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

Esempio STDIN:

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

5

Puoi anche collegarlo direttamente agli appunti (almeno su mac):

openssl base64 -in [filename] | pbcopy


golf: base64 < [filename] | pbcopy
totels

2
uuencode -m [-o output_file] [file] name

Dove nome è il nome da visualizzare nell'intestazione codificata.

Esempio:

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

o

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css

uuencode non è la codifica come base64
ccpizza

2

Per qualche ragione, echo -n <data> | openssl base64 aggiunta una nuova riga nel mezzo dei miei dati di base64. Presumo che fosse perché i miei dati di base64 erano davvero lunghi.

utilizzando echo -n <data> | base64 codificare e echo -n <base64-ed data> | base64 -D decodificare ha funzionato bene.


nb: sul mio nix, ho dovuto usare -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55

2

Pitone

Python viene preinstallato su tutti i Mac al giorno d'oggi.

In Terminal run python (o ipython ).

Codifica un file:

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

Decodifica un file:

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

Naturalmente, entrambe le operazioni possono essere convertite in un oneliner, ma in questo modo è più leggibile.

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

Omettendo il -out / -output... filename stamperà su stdout.

Base64

Un'altra utility ootb presente sia in OSX che 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

1

C'è Perl plus MIME :: Base64:

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

Questo è preinstallato. È possibile specificare file separati sulla riga di comando (o fornire i dati sullo standard input); ogni file è codificato separatamente. Puoi anche fare:

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

Questo esegue il backup di file1 su file1.txt e scrive l'output codificato Base-64 sul file originale.


1

Una semplice versione di NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"

Non penso che questa sia una risposta migliore come openssl (e adesso base64 ) venire con il sistema operativo.
Josh

A rischio di dividere i capelli - e, sono consapevole che questa critica si applica anche ad un paio di altre risposte - la domanda ha chiesto come codificare un file o stdin . Se non sbaglio, la tua risposta mostra solo come codificare una stringa.
G-Man

1

recode dovrebbe fare il trucco per te

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

recode è disponibile per OS X tramite MacPorts .


Non c'è niente di costruito?
Josh

@Josh - c'è - openssl
Steve Folly

MacPorts non viene fornito con alcuna distribuzione di OS X. Ci sono molte altre opzioni che fanno. Per esempio solo base64 comando.
Jason S

1

Se si sta codificando come base64 un file font, è possibile farlo:

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

Lo uso su un Mac (10.10) tutto il tempo.

Nota : Non ci saranno interruzioni di riga.


1

Oltre alla risposta di Steve Folly sopra, quando si esegue la crittografia in modalità stdin, per evitare il passaggio di nuove righe aggiuntive, premere CTRL + D due volte per terminare l'input senza alcuna nuova riga aggiuntiva. L'output verrà visualizzato subito dopo la stessa riga.

Per esempio:

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

In alternativa, puoi usare printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

Su macOS uso sempre:

echo -n "STRING" | base64

-n è di evitare un nuovo carattere di linea alla fine della riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.