Questão Como codificar base64 via linha de comando?


Existe um comando de terminal no Mac OS X que irá codificar em base64 um arquivo ou stdin?


155


origem


Esteja ciente de que, embora a sintaxe de codificação base64 seja consistente de um SO para outro, a sintaxe de decodificação base64 é base64 -d ou base64 -D dependendo do seu sistema operacional. O OSX usa -D. - Chris Johnson
@ChrisJohnson Se usado em concerto com openssl a bandeira para decodificação é -d no OS X (10.10 Yosemite). - ᴠɪɴᴄᴇɴᴛ


Respostas:


openssl pode fazer isso por você e tudo é instalado com o OS X por padrão; Não há necessidade de instalar o darwinports.

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

Sem o -in opção lê de stdin


175



Usar openssl base64 < path/to/file.png | tr -d '\n' | pbcopy ou cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy para pular a escrita para um arquivo e apenas copiar a saída codificada em base64 para a área de transferência sem as quebras de linha. - Mathias Bynens
E use um -d sinalizar para decodificar. - kenny
No mac, To base64 codifica uma string: openssl base64 -e <<< ram e decodificar: openssl base64 -d <<< cmFtCg== - Ram Patra
@mathias se você não quiser novas linhas openssl base64 [-e] -A faz isso. + @kenny na decodificação se a entrada não tiver nova linha a cada 76 caracteres no máximo, incluindo o caso de não-novas linhas que acabei de afirmar, você precisa -d -A ou você obterá dados ausentes ou corrompidos sem mensagem de erro (embora haja um relatório de bug pendente que pode resultar em uma correção para isso). - dave_thompson_085
@RAM, openssl base64 -e <<< ram na verdade codifica 4 bytes, incluindo um feed de linha à direita; Vejo hexdump <<< ram. - Arjan


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>

60



No entanto, a solução "echo" adiciona um caractere LF (feed de linha) ao final da string de entrada. Melhor uso: echo -n 'input' - SuperTempel
E até um pouco mais sucinto openssl base64 <<< input - Garrett Fogerlie
Ou apenas use base64 sem openssl. De qualquer maneira, eu preciso pressionar Ctrl + D duas vezes. E cuidado, @ Garret: no Bash, com ou sem openssl, openssl base64 <<< superuser e openssl base64 <<< "superuser"  erroneamente produção c3VwZXJ1c2VyCg==, como a "string aqui", então, ainda inclui um avanço de linha! (Pelo visto não apenas no Bash, mas também no zsh, ksh e yash. Vejo hexdump <<< superuser. O resultado Base64 deve ser c3VwZXJ1c2Vy.) - Arjan
@Arjan Eu hesitaria em usar a palavra "erroneamente" - como você apontou, a string here inclui uma linha de alimentação, mas por uma boa razão - unix.stackexchange.com/questions/20157/… . echo -n é preferível se você não precisa da nova linha. Certamente é algo para estar ciente. - Steve Folly
Você poderia usar printf no lugar de echo -n - Jason S


Tente usar:

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

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


31



Ótimo. Simples e elegante. Obrigado! - Leon li


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

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


21



Você tem um exemplo? eu recebo Invalid characer in input stream quando usando <<<... eu tentei com ", ' e nada ao redor da corda. - Jonas
@Jonas Em que shell você está? Você pode usar isso em bash e zsh. - WKPlus
Ah, deixa pra lá, funciona! - Jonas


Em termos de velocidade, eu usaria openssl seguido por perl, seguido por uuencode. Em termos de portabilidade, eu usaria uuencode seguido por Perl seguido por openssl (Se você se preocupa em reutilizar o código em tantas outras plataformas de estoque UNIX quanto possível). Tenha cuidado, porque nem todas as variantes do UNIX suportam o switch -m (o iirc AIX faz, o HP / UX faz, 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 por RFC1521 e escreva-o para filename.b64 (com filename_when_uudecoded.txt como nome de arquivo padrão quando decodificado):

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

Exemplo STDIN:

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

5





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

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

Ou instale coreutils através da Brew (brew install coreutils) que fornecerá base64 comando:

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

5





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

openssl base64 -in [filename] | pbcopy


4



golfe: base64 < [filename] | pbcopy - totels


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

2



uuencode não é a codificação como base64 - ccpizza


Por algum motivo, echo -n <data> | openssl base64 adicionou uma nova linha no meio dos meus dados de base64. Eu suponho que foi porque meus dados de base64 eram muito longos.

Usando echo -n <data> | base64 codificar e echo -n <base64-ed data> | base64 -D decodificar funcionou bem.


2



nb: no meu nix, eu tive que usar -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d algum usuário: somepassword - mlo55


Há o Perl mais o 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 do arquivo1 no arquivo1.txt e grava a saída codificada na Base 64 sobre o arquivo original.


1