Komut satırından bir base64 dizesini nasıl çözebilirim?

Bir base64 dizesini çözmek için bir bash betiği yazmak istiyorum. Örneğin, yazıyorum decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== ve yazdırıyor Aladdin:open sesame ve komut istemine geri döner.

Şimdiye kadar aşağıdakileri içeren basit bir bash dosyası denedim python -m base64 -d $1 ancak bu komut bir dize değil bir dosya adı bekler. Herhangi bir ek paket yüklemeye gerek kalmadan bunu başarmak için komut satırından çalıştırabileceğim başka bir etkileşimli olmayan komut (mutlaka bir Python modülünde değil) var mı? (Ya da yaparsam, süper minimal bir şey.)

Sadece kullan base64 gelen program coreutils paket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Veya satırsonu karakterini eklemek için

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

çıktı (satırsonu içerir):

Aladdin:open sesame

openssl ayrıca base64'ü kodlayabilir ve kodunu çözebilir

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

DÜZENLEME: Base64 kodlanmış dizenin birden çok satırda bittiği bir örnek:

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

Al bakalım!

Aşağıdakini bilgisayarınızın altına ekleyin ~/.bashrc dosya:

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

Şimdi yeni bir Terminal açın ve komutu çalıştırın.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Bu, sorunuzda tam olarak ne istediğinizi yapacaktır.

Orijinal bağımlılıklarınızla, bunu orijinal komut dosyanızda küçük bir değişiklikle yapmak mümkündür:

echo $1 | python -m base64 -d

Bir dosya adı iletmezseniz, bu python modülü standart girdiden okur. İlk parametreyi içine bağlamak için şunları kullanabilirsiniz echo $1 |.

Base64 komut satırına yorum yaptım http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Bu yüzden openssl base64 kod çözme özelliğini kullanırken bir Uyarı veriyorum :

 openssl base64 -e <<< 'Welcome to openssl wiki' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kKopenssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'Welcome to openssl wiki

uyarı openssl'de base64 satır uzunluğu varsayılan olarak 64 karakterle sınırlıdır :

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

> HİÇBİR ŞEY!

64 karakteri aşan satır beslemesi olmayan bir base64 satırının kodunu çözebilmek için -A seçeneğini kullanın :

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

Bu, aslında base64 sonucunu 64 karakter satırına bölmek için daha iyidir, çünkü - Bir seçenek buggy'dir (uzun dosyalarla sınırlayın).

Kullanım perl

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

Veya aynı ile python

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

Sadece bunu yapmanın başka bir yolunu eklemek için:

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

Bu sefer birkaç dakika saçımı çektim çünkü base64 Linux aracı ve ayrıca openssl gerçekten çözebilir. Ama biraz yanlış değere çözen bu özel base64 kodlu dosyam var. Birkaç bayt eşleşir, ancak o zaman bu varlık vardır EF BF BD EF BF BD içeri baktığımda hexedit görüntüleyici. Ve sonra bir sonraki bayt dizisi, doğru şekilde çözülmüş beklenen çıktıya kıyasla tekrar eşleşir. Bu garip bayt dizisi, aradaki boşluklara, bazen EF BF BD sadece.

Sorunu çözmek için Java göndericisinin nasıl kodladığına bakmam gerekiyor ve sonra küçük bir java base64 kod çözücü oluşturdum. Ve şimdi beklenen değeri çözebilirim.

İşte bunu yapan küçük snippet: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

Güzel soru. Ve ipucunuz için teşekkürler, şimdi 'python -m base64 -h’nin kullanışlı olabileceğini biliyorum.