Como codificar a base64 via linha de comando?
Existe um comando terminal no Mac OS X que codificará um ficheiro ou stdin com base64?
Existe um comando terminal no Mac OS X que codificará um ficheiro ou stdin com base64?
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
Tente usar:
base64 -i <in-file> -o <outfile>
Deve estar disponível por defeito no OS X.
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
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
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.
## 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.
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
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.
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
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=
$
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.
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.
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.