2010-03-16 23:15:37 +0000 2010-03-16 23:15:37 +0000
243
243

Como codificar a base64 via linha de comando?

Existe um comando terminal no Mac OS X que codificará um ficheiro ou stdin com base64?

Respostas (17)

252
252
252
2010-03-17 00:25:08 +0000

openssl pode fazer isto por si, e está tudo instalado com o OS X por defeito; não há necessidade de instalar darwinports.

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

Sem a opção -in lê-se da stdin

107
107
107
2010-04-21 06:12:44 +0000

Openssl pode ser utilizado de forma mais sucinta:

echo -n 'input' | openssl base64

[echo -n -> deve ser utilizado, ou a codificação será feita incluindo um novo carácter de linha]

ou

openssl base64 <ENTER> [type input] <CTRL+D>
54
54
54
2015-02-27 20:13:36 +0000

Tente usar:

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

Deve estar disponível por defeito no OS X.

34
34
34
2016-03-17 02:48:49 +0000

O comando base64 está disponível por defeito no meu OS X 10.9.4.

Pode utilizar base64 <<< string e base64 -D <<< string para codificar e descodificar uma string no terminal, ou base64 -in file e base64 -D -in file para codificar e descodificar um ficheiro.

16
16
16
2017-08-01 05:33:00 +0000

Em macOS I use sempre:

echo -n "STRING" | base64

-n é para evitar um novo carácter de linha no final da linha.

8
8
8
2015-05-25 17:19:49 +0000

Como 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 instalar coreutils via Brew (brew install coreutils) que irá fornecer o comando base64:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
5
5
5
2012-09-05 07:43:32 +0000

Em termos de velocidade, eu utilizaria openssl seguido de perl, seguido de uuencode. Em termos de portabilidade, eu utilizaria uuencode seguido de Perl seguido de openssl (Se você se preocupa em reutilizar o código no maior número possível de outras plataformas UNIX como plataformas de estoque). Mas tenha cuidado porque nem todas as variantes UNIX suportam o switch -m (iirc AIX suporta, HP/UX suporta, 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 o switch -m para uuencode file_in. txt por base64 como especificado por RFC1521 e escreva-o para 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

STDIN exemplo:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
5
5
5
2016-07-12 15:39:22 +0000

Pode também canalizá-lo directamente para a prancheta (pelo menos em mac):

openssl base64 -in [filename] | pbcopy

3
3
3
2014-06-17 10:00:25 +0000

Python

Python vem pré-instalado em todos os macs hoje em dia.

Em Terminal run python (ou ipython ).

Codificar um ficheiro:

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

Descodificar um ficheiro:

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

Claro, ambas as operações podem ser convertidas para 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

Omitir o -out/-output... filename irá imprimir para stdout.

base64

Outro utilitário ootb presente tanto em OSX como em 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
2
2
2
2014-07-27 05:16:22 +0000

Por alguma razão, echo -n <data> | openssl base64 acrescentou uma nova linha no meio dos dados da minha base64. Presumo que foi porque os dados da minha base64 eram realmente longos.

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

2
2
2
2013-04-04 20:12:06 +0000
uuencode -m [-o output_file] [file] name

Onde name é o nome a exibir 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
2
2
2016-07-27 18:14:32 +0000

Além da resposta de Steve Folly acima, ao encriptar em modo stdin, para evitar a passagem de linhas novas adicionais, pressione CTRL+D duas vezes para terminar a entrada sem quaisquer linhas novas adicionais. A saída irá aparecer logo após a mesma linha.

Por exemplo:

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

Em alternativa, poderá usar printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
1
1
1
2010-03-17 04:24:21 +0000

Existe Perl plus MIME::Base64:

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

Isto vem pré-instalado. Pode especificar ficheiros separados na linha de comando (ou fornecer os dados na entrada padrão); cada ficheiro é codificado separadamente. Também pode fazer:

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

Isto faz o backup do ficheiro1 para o ficheiro1.txt, e escreve a saída codificada Base-64 sobre o ficheiro original.

1
1
1
2016-04-18 22:13:21 +0000

Se você está base64 codificando 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á quebra de linha.

1
1
1
2010-03-17 00:00:24 +0000

recode deve fazer o truque para você

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

recode está disponível para OS X via MacPorts .

1
1
1
2019-07-08 16:00:26 +0000

Soluções multiplataforma

Compilámos uma lista de comandos shell multiplataforma para codificar um ficheiro como base64. Os comandos seguintes pegam num ficheiro de entrada (chamado deploy.key em exemplos) e convertem-no para base64 sem qualquer nova linha de envoltura. A saída da base64 é impressa para o 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 redireccionar a saída para um ficheiro, anexe > base64-encoded.txt (usando um nome de ficheiro à sua escolha).

Estes comandos foram prototipados como parte deste pull request onde queríamos que comandos de shell multi-plataforma codificassem uma chave privada SSH para remover novas linhas.

1
1
1
2015-03-27 13:09:24 +0000

Uma versão simples do NodeJS:

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