Como codificar base64 via linha de comando?

217

Existe um comando de terminal no Mac OS X que codifica base64 um arquivo ou stdin?

Josh
fonte
5
Lembre-se de que, embora a sintaxe da codificação base64 seja consistente de um sistema operacional para outro, a sintaxe da decodificação base64 é base64 -dou base64 -Ddepende do seu sistema operacional. OSX usa -D.
Chris Johnson
@ ChrisJohnson Se usado em conjunto com opensslo sinalizador para decodificação, está -dno OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Respostas:

231

opensslpode fazer isso por você e tudo está instalado no OS X por padrão; não é necessário instalar o darwinports.

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

Sem a -inopção lê de stdin

Steve Folly
fonte
79
Use openssl base64 < path/to/file.png | tr -d '\n' | pbcopyou cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopypara pular a gravação em um arquivo e apenas copiar a saída codificada em base64 para a área de transferência sem quebras de linha.
Mathias Bynens 12/04
3
E use uma -dbandeira para decodificar.
Kenny
5
No mac, To base64 codifica uma string: openssl base64 -e <<< rame decodifica:openssl base64 -d <<< cmFtCg==
Ram Patra
8
@ Matias, se você não quiser novas linhas, openssl base64 [-e] -Afaz isso. + @kenny ao decodificar se a entrada não possuir nova linha a cada 76 caracteres, incluindo o caso sem novas linhas que acabei de declarar, você precisa -d -Aou receberá dados ausentes ou corrompidos sem mensagem de erro (embora exista um relatório de bug pendente que pode resultar em uma correção para isso).
Dave_thompson_085
2
@Ram, openssl base64 -e <<< ramna verdade codifica 4 bytes, incluindo um avanço de linha à direita; veja hexdump <<< ram.
Arjan
93

O Openssl pode ser usado de forma mais sucinta:

echo -n 'input' | openssl base64

[echo -n -> deve ser usado ou a codificação será feita incluindo o novo caractere de linha]

ou

openssl base64 <ENTER> [type input] <CTRL+D>
Glen
fonte
10
A solução "eco" adiciona um caractere LF (avanço de linha) ao final da string de entrada. Melhor uso: echo -n 'input'
SuperTempel 17/07/2012
8
E até mesmo um pouco mais sucintoopenssl base64 <<< input
Garrett Fogerlie
2
Ou apenas use base64sem openssl. De qualquer forma, preciso pressionar Ctrl + D duas vezes. E cuidado, @Garret: no Bash, com ou sem openssl, openssl base64 <<< superusere produza openssl base64 <<< "superuser" erroneamentec3VwZXJ1c2VyCg== , pois a "string aqui" ainda inclui um feed de linha! ( Aparentemente . Não apenas em Bash, mas também em zsh, ksh e yash Ver hexdump <<< superuser. O resultado Base64 deve ser c3VwZXJ1c2Vy.)
Arjan
@Arjan Eu hesitaria em usar a palavra "erroneamente" - como você apontou, a string aqui inclui um feed de linha, mas por boas razões - unix.stackexchange.com/questions/20157/… . echo -né preferível se você não precisar da nova linha. Certamente é algo para estar ciente.
Steve Folly
2
Você poderia usar printfno lugar deecho -n
Jason S
50

Tente usar:

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

Ele deve estar disponível por padrão no OS X.

Derreck Dean
fonte
1
Adicione --decodepara reverter o processo da base64 ao normal.
luckydonald
1
Isso é melhor para codificação para SVG porque cria uma linha. Isso é mais limpo que a saída de openssl base64. Obrigado!
Shanimal 18/04
32

base64 comando está disponível por padrão no meu OS X 10.9.4.

Você pode usar base64 <<< stringe base64 -D <<< stringpara codificar e decodificar uma string no terminal, ou base64 -in filee base64 -D -in filepara codificar e decodificar um arquivo.

WKPlus
fonte
Você tem um exemplo? Eu recebo Invalid characer in input streamao usar <<<... eu tentei com ", 'e nada ao redor da corda.
Jonas
@Jonas Em que shell você está? Você pode usar isso no bash e no zsh.
WKPlus 21/09
Ah, deixa pra lá, funciona!
Jonas
8

Como o Python é fornecido com o OS X por padrão, você pode usá-lo como abaixo:

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

Ou instale coreutilsvia Brew ( brew install coreutils) que fornecerá o base64comando:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
kenorb
fonte
6

No macOS, eu sempre uso:

echo -n "STRING" | base64

-n é para evitar um novo caractere de linha no final da linha.

patrickS
fonte
5

Em termos de velocidade, eu usaria openssl seguido de perl, seguido de uuencode. Em termos de portabilidade, eu usaria o uuencode, seguido pelo Perl e o openssl (se você se preocupa em reutilizar o código em tantas outras plataformas UNIX quanto possível, como plataformas de estoque). Tenha cuidado, pois nem todas as variantes do UNIX suportam a opção -m (o iirc AIX, o HP / UX, o Solaris não).

$ 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

Use a opção -m para uuencode file_in.txt por base64, conforme especificado pelo RFC1521, e grave -o em filename.b64 (com filename_when_uudecoded.txt como o nome de arquivo padrão quando decodificado):

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

Exemplo de STDIN:

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

Você também pode direcioná-lo diretamente para a área de transferência (pelo menos no mac):

openssl base64 -in [filename] | pbcopy

Steve
fonte
golfe:base64 < [filename] | pbcopy
totels 11/08/16
3

Pitão

Atualmente, o Python vem pré-instalado em todos os macs.

No Terminal, execute python(ou ipython ).

Codifique um arquivo:

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

Decodifique um arquivo:

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

Obviamente, ambas as operações podem ser convertidas em um oneliner, mas dessa maneira é mais legível.

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

Omitir -out/ -output... filenameimprimirá em stdout.

base64

Outro utilitário ootb presente no OSX e no 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
fonte
2
uuencode -m [-o output_file] [file] name

Onde nome é o nome a ser exibido no cabeçalho codificado.

Exemplo:

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

ou

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
user214207
fonte
uuencodenão é a codificação comobase64
ccpizza 17/11
2

Por alguma razão, echo -n <data> | openssl base64adicionei uma nova linha no meio dos meus dados base64. Suponho que foi porque meus dados base64 eram realmente longos.

Usar echo -n <data> | base64para codificar e echo -n <base64-ed data> | base64 -Ddecodificar funcionou bem.

Heath Borders
fonte
nb: no meu nix, eu tive que usar -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55
2

Além da resposta de Steve Folly acima, ao criptografar no modo stdin, para evitar a transmissão de novas linhas extras, pressione CTRL + D duas vezes para finalizar a entrada sem novas linhas adicionais. A saída será exibida logo após a mesma linha.

Por exemplo:

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

Como alternativa, você pode usar printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
bigT
fonte
1

Há Perl mais MIME :: Base64:

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

Isso vem pré-instalado. Você pode especificar arquivos separados na linha de comando (ou fornecer os dados na entrada padrão); cada arquivo é codificado separadamente. Você também pode fazer:

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

Isso faz o backup de arquivo1 em arquivo1.txt e grava a saída codificada em Base-64 sobre o arquivo original.

Jonathan Leffler
fonte
1

Uma versão simples do NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauvm
fonte
Eu não acho que essa seja uma resposta melhor, já que openssl(e agora base64) vem com o sistema operacional.
27415 Josh
Correndo o risco de rachar os cabelos - e, estou ciente de que essa crítica também se aplica a algumas das outras respostas -, a pergunta foi feita como codificar um arquivo ou stdin . Se não me engano, sua resposta mostra apenas como codificar uma string.
G-Man
1

recodificar deve fazer o truque para você

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

recodificação está disponível para OS X via MacPorts .

pesado
fonte
Não há nada embutido?
Josh
@ Josh - não é - openssl #
Steve Folly
O MacPorts não vem com nenhuma distribuição do OS X. Existem muitas outras opções que o fazem. Por exemplo, apenas base64comando.
Jason S
1

Se você estiver codificando base64 um arquivo de fonte, poderá fazer o seguinte:

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

Eu uso isso em um Mac (10.10) o tempo todo.

Nota : Não haverá quebras de linha.

Chuck Ugwuh
fonte
1

Soluções multiplataforma

Compilamos uma lista de comandos shell de plataforma cruzada para codificar um arquivo como base64. Os comandos a seguir pegam um arquivo de entrada (nomeado deploy.keyem exemplos) e o convertem em base64 sem nenhuma quebra de linha nova. A saída base64 é impressa no 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

Para redirecionar a saída para um arquivo, acrescente > base64-encoded.txt(usando um nome de arquivo de sua escolha).

Esses comandos foram prototipados como parte dessa solicitação de recebimento, onde queríamos que os comandos do shell de plataforma cruzada base64 codificassem uma chave privada SSH para remover novas linhas.

Daniel Himmelstein
fonte