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.)
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.
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 |.
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 ).
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.