Como decodificar uma string base64 na linha de comando?

426

Eu gostaria de escrever um script bash para decodificar uma string base64. Por exemplo, digito decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==e ele imprime Aladdin:open sesamee retorna ao prompt.

Até agora, tentei um arquivo bash simples que continha, python -m base64 -d $1mas esse comando espera um nome de arquivo e não uma string. Existe outro comando não interativo (não necessariamente em um módulo Python) que eu possa executar na linha de comando para conseguir isso, sem precisar instalar nenhum pacote extra? (Ou se eu fizer, algo super-mínimo.)

david.libremone
fonte

Respostas:

630

Basta usar o base64programa do coreutilspacote:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Ou, para incluir o caractere de nova linha

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

saída (inclui nova linha):

Aladdin:open sesame
janeiro
fonte
10
Ou: eco QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Greg
61
Ou:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk
4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtNo Windows com base64 do git.
Fogo
3
@ Janeiro Não é Just use, porque muitas pessoas conhecem o base64programa - mas como não se pode simplesmente inserir uma string como opção de linha de comando, é difícil obter a sintaxe correta para os usuários que tocam na CLI apenas de vez em quando.
feeela
12
No Mac, copie a sequência codificada para a área de transferência e execute pbpaste | base64 --decode.
Marián Černý
95

O openssl também pode codificar e decodificar base64

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

EDIT: Um exemplo em que a cadeia codificada base64 termina em várias linhas:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'
QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
$ openssl enc -base64 -d << EOF
> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
> EOF
And if the data is a bit longer, the base64 encoded data will span multiple lines.
Geirha
fonte
8
Graças a resposta de Philippe, você precisa adicionar -A para strings base64 longos de outra forma openssl retornará nada, ver askubuntu.com/a/271676/305568
Morloch
@morloch ou apenas evitar remover as novas linhas dos base64 codificado de dados, e funciona como esperado ...
geirha
1
Eu não consideraria coreutilsum pacote de "adicional" que contém programas como ls, mkdir, cp, mv, e chmod. Duvido que você possa fazer algo útil com sua máquina sem ela.
vidstige
@vidstige, isso é verdade. Não sei por que tive a impressão de que o base64 não foi instalado por padrão; esse não é totalmente o caso.
precisa saber é
1
Embora essa seja a troca de pilhas do ubuntu, o uso openssltem a vantagem sobre o padrão base64de trabalho no Git Bash no Windows, pelo menos a versão 1.8.1 do Git Bash mais antiga que eu instalei.
willkil
38

Aqui está!

Adicione o seguinte ao final do seu ~/.bashrcarquivo:

decode () {
  echo "$1" | base64 -d ; echo
}

Agora, abra um novo terminal e execute o comando

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Isso fará exatamente o que você pediu na sua pergunta.

SirCharlo
fonte
20

Com suas dependências originais, é possível fazer isso com uma pequena modificação no seu script original:

echo $1 | python -m base64 -d

Se você não passar um nome de arquivo, esse módulo python lê a partir da entrada padrão. Para canalizar o primeiro parâmetro nele, você pode usar echo $1 |.

AmanicA
fonte
1
Também: python -m base32 filename
kenorb
1
isso não funciona :) mas usar .b32 * métodos
RZR
13

Eu comentei a linha de comando base64 em http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Então, emito um aviso ao usar a decodificação openssl base64:

 openssl base64 -e <<< 'Welcome to openssl wiki'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

aviso: o comprimento da linha base64 é limitado a 64 caracteres por padrão no openssl :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

=> NADA!

para poder decodificar uma linha base64 sem avanço de linha que exceda 64 caracteres, use a opção -A:

openssl base64 -d -A <<<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

Welcome to openssl wiki with a very long line that splits...

De qualquer maneira, é melhor dividir o resultado base64 em linhas de 64 caracteres, já que a opção -A é BUGGY (limite com arquivos longos).

philippe lhardy
fonte
4

Usando perl

perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Ou o mesmo com python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
fonte
2

Apenas para adicionar outra maneira de fazer isso:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
erjoalgo
fonte