Como posso decodificar uma string base64 a partir da linha de comando?

333

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

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

    
por d3vid 21.08.2012 / 14:17

7 respostas

502

Basta usar o programa base64 do pacote coreutils :

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
    
por January 21.08.2012 / 15:34
76

openssl também pode codificar e decodificar base64

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

EDIT: Um exemplo onde a string codificada em 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.
    
por geirha 22.08.2012 / 00:23
31

Aqui está!

Adicione o seguinte ao final do arquivo ~/.bashrc :

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

Agora, abra um novo Terminal e execute o comando.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

    
por SirCharlo 21.08.2012 / 15:39
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 entrada padrão. Para canalizar o primeiro parâmetro para ele, você pode usar echo $1 | .

    
por AmanicA 05.10.2012 / 14:15
12

Eu fiz o comentário da linha de comando base64 no link . Então eu 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

o aviso 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 alimentaçã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 forma, isso é melhor para dividir o resultado base64 em 64 linhas, já que -A opção é BUGGY (limite com arquivos longos).

    
por philippe lhardy 23.03.2013 / 19:23
4

Usando perl

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

Ou o mesmo com python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
    
por A.B. 02.07.2015 / 22:22
2

Apenas para adicionar outra maneira de fazer isso:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
    
por erjoalgo 15.06.2016 / 08:27