Como posso decodificar uma string base64 da linha de comando?

Eu gostaria de escrever um script bash para decodificar uma string base64. Por exemplo, eu 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 um nome de arquivo não 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.)

Basta usar o base64 programa do coreutils pacote:

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

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 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.'QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=$ openssl enc -base64 -d << EOF> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=> EOFAnd if the data is a bit longer, the base64 encoded data will span multiple lines.

Aqui tens!

Adicione o seguinte à parte inferior do seu ~/.bashrc arquivo:

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.

Com suas dependências originais, é possível fazer isso com uma pequena modificação em 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 para ele, você pode usar echo $1 |.

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

 openssl base64 -e <<< 'Welcome to openssl wiki' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kKopenssl 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 alimentação de linha que exceda 64 caracteres, use-uma opção :

openssl base64 -d -A <<<'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='Welcome to openssl wiki with a very long line that splits...

De qualquer forma, é melhor dividir o resultado base64 em linhas de 64 caracteres, pois-uma opção é BUGGY ( limite com arquivos longos ).

Mear perl

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

Ou o mesmo com python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Apenas para adicionar outra maneira de fazer isso:

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

Eu tive alguns momentos de puxar o cabelo neste Porque o base64 Ferramenta Linux e também o openssl pode decodificar, de fato. Mas eu tenho esse arquivo codificado em base64 específico que decodifica para um valor ligeiramente errado. Os poucos bytes correspondem, mas há essa presença de EF BF BD EF BF BD quando eu vejo em hexedit evento. E então a próxima sequência de bytes corresponde novamente quando comparada à saída esperada decodificada corretamente. Essas sequências estranhas de bytes foram inseridas nos intermediários, às vezes como EF BF BD apenas.

Para resolver o problema, tenho que olhar como o remetente Java o codifica e então criei um pequeno decodificador java Base64. E agora posso decodificar para o valor esperado.

Aqui está o pequeno trecho que faz isso: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

Boa pergunta. E obrigado pela sua dica, agora sei que o` python-m base64-h ’ pode se tornar útil.