Como codificar base64 via linha de comando?

167

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

    
por Josh 17.03.2010 / 00:15

16 respostas

185

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 a opção -in da stdin

    
por 17.03.2010 / 01:25
66

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>
    
por 21.04.2010 / 08:12
33

Tente usar:

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

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

    
por 27.02.2015 / 21:13
24
O comando

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

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

    
por 17.03.2016 / 03:48
6

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

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

Ou instale coreutils via Preparar ( brew install coreutils ), que fornecerá o comando base64 :

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
    
por 25.05.2015 / 19:19
5

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
    
por 05.09.2012 / 09:43
4

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

openssl base64 -in [filename] | pbcopy

    
por 12.07.2016 / 17:39
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
    
por 04.04.2013 / 22:12
2

Por alguma razão, echo -n <data> | openssl base64 adicionou uma nova linha no meio dos meus dados base64. Eu suponho que foi porque meus dados de base64 foram muito longos.

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

    
por 27.07.2014 / 07:16
2

Python

O Python vem pré-instalado em todos os macs atualmente.

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)

É claro que ambas as operações podem ser convertidas em um oneliner, mas desta forma é 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

A omissão do -out / -output... filename será impressa no 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
    
por 17.06.2014 / 12:00
1

Existe 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

Faz o backup do arquivo1 para o arquivo1.txt e grava a saída codificada na Base-64 sobre o arquivo original.

    
por 17.03.2010 / 05:24
1

Uma versão simples do NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
    
por 27.03.2015 / 14:09
1

recode deve fazer o truque para você

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

O recode está disponível para o OS X através de MacPorts .

    
por 17.03.2010 / 01:00
1

Se você estiver codificando com base64 um arquivo de fonte, você pode fazer isso:

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.

    
por 19.04.2016 / 00:13
1

Além da resposta de Steve Folly acima, ao criptografar no modo stdin, para evitar passar novas linhas extras, pressione CTRL + D duas vezes para finalizar a entrada sem nenhuma nova linha adicional. A saída será mostrada 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=
$
    
por 27.07.2016 / 20:14
1

No macOS eu sempre uso:

echo -n "STRING" | base64

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

    
por 01.08.2017 / 07:33