Questão Como posso decodificar uma string base64 a partir 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 esse 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.)


320
2017-08-21 12:17


origem




Respostas:


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

484
2017-08-21 13:34



Ou: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Ou: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt No Windows com base de git64. - Fire
@Janeiro não é Just use, porque muitas pessoas sabem sobre o base64 programa - mas como não se pode somente insira uma string como opção de linha de comando, é difícil obter a sintaxe correta para usuários que tocam na CLI apenas de vez em quando. - feeela
No Mac, copie a string codificada na área de transferência e execute pbpaste | base64 --decode. - Marián Černý


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

75
2017-08-21 22:23



Graças à resposta de Philippe, você precisa adicionar -A para seqüências longas de base64 caso contrário, openssl não retornará nada, veja askubuntu.com/a/271676/305568 - morloch
@morloch ou apenas evite remover as novas linhas dos dados codificados em base64, e ele funciona como esperado ... - geirha
Eu não consideraria coreutils um pacote "adicional" contendo programas como ls, mkdir, cp, mve chmod. Eu duvido que você possa fazer qualquer coisa útil com sua máquina sem ela. - vidstige
@vidstige, isso é verdade. Não sei porque fiquei com a impressão de que base64 não foi instalado por padrão; isso não é totalmente o caso. - geirha
Enquanto isso é a troca de pilha do Ubuntu, usando openssl tem a vantagem sobre o padrão base64 de trabalhar em Git Bash no Windows, pelo menos, a versão 1.8.1 Git Bash mais antiga que eu instalei. - willkil


Aqui está!

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.


32
2017-08-21 13:39





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


18
2017-10-05 12:15



Também: python -m base32 filename - kenorb
isso não funciona :) mas use os métodos .b32 * - rzr


Eu fiz comentário linha de comando base64 em http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Então eu emito um aviso ao usar decodificação openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

Atenção 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 a opção -A:

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 64 linhas, já que -A opção é BUGGY (limite com arquivos longos).


12
2018-03-23 18:23



@Seth por favor redefina os blocos corretamente, o comando openssl de edição mesclado com meus comentários intercalados. - philippe lhardy
Você pode concertar isso? Eu não posso diferenciar entre os dois ... Vou tentar, mas você pode precisar me ajudar ;-) - Seth♦
bem só tem que dar uma olhada wiki.opensslfoundation.com/… onde eu consegui usar a sintaxe wiki melhor (busca bas64 nesta página). - philippe lhardy


Usando perl

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

Ou o mesmo com python

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

4
2017-07-02 20:22





Apenas para adicionar outra maneira de fazer isso:

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

2
2018-06-15 06:27