Pertanyaan Bagaimana saya bisa memecahkan kode string base64 dari baris perintah?


Saya ingin menulis skrip bash untuk memecahkan kode string base64. Misalnya saya mengetik decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== dan itu dicetak Aladdin:open sesame dan kembali ke prompt.

Sejauh ini saya telah mencoba file bash sederhana yang berisi python -m base64 -d $1 tetapi perintah ini mengharapkan nama file bukan string. Apakah ada perintah non-interaktif lainnya (tidak harus dalam modul Python) yang dapat saya jalankan dari baris perintah untuk mencapai ini, tanpa harus menginstal paket tambahan? (Atau jika saya lakukan, sesuatu yang super-minimal.)


319
2017-08-21 12:17


asal




Jawaban:


Cukup gunakan base64 program dari coreutils paket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Atau, untuk menyertakan karakter baris baru

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

output (termasuk baris baru):

Aladdin:open sesame

483
2017-08-21 13:34



Atau: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Atau: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Pada Windows dengan base64 git. - Fire
@Januari Itu tidak Just use, karena banyak orang tahu tentang itu base64 program - tetapi karena tidak bisa hanya masukkan string sebagai opsi baris perintah, sulit untuk mendapatkan hak sintaks bagi pengguna yang hanya menyentuh CLI sesekali. - feeela
Di Mac, salin string yang dienkode ke clipboard dan jalankan pbpaste | base64 --decode. - Marián Černý


openssl juga dapat mengkodekan dan memecahkan kode base64

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

EDIT: Contoh di mana string berenkode base64 berakhir pada beberapa baris:

$ 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



Terima kasih untuk jawaban Philippe, Anda perlu menambahkan -A untuk string base64 panjang jika tidak terbuka akan mengembalikan apa-apa, lihat askubuntu.com/a/271676/305568 - morloch
@morloch atau hindari menghapus baris baru dari base64 encoded data, dan berfungsi seperti yang diharapkan ... - geirha
Saya tidak akan mempertimbangkan coreutils paket "tambahan" yang berisi program seperti ls, mkdir, cp, mv, dan chmod. Saya ragu Anda dapat melakukan sesuatu yang berguna dengan mesin Anda tanpa itu. - vidstige
@vidstige, itu benar. Saya tidak tahu mengapa saya mendapat kesan bahwa base64 tidak diinstal secara default; itu sama sekali tidak terjadi. - geirha
Sementara ini adalah pertukaran tumpukan ubuntu, menggunakan openssl memiliki kelebihan dibanding standar base64 bekerja di Git Bash pada Windows, setidaknya versi 1.8.1 Git Bash yang lebih lama yang telah saya instal. - willkil


Di sini kamu pergi!

Tambahkan yang berikut ini ke bagian bawah Anda ~/.bashrc mengajukan:

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

Sekarang, buka Terminal baru dan jalankan perintah.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ini akan melakukan persis apa yang Anda minta dalam pertanyaan Anda.


32
2017-08-21 13:39





Dengan dependensi asli Anda dimungkinkan untuk melakukan ini dengan sedikit modifikasi pada skrip asli Anda:

echo $1 | python -m base64 -d

Jika Anda tidak melewatkan nama file, modul python itu membaca dari input standar. Untuk menyalurkan parameter pertama ke dalamnya, Anda dapat menggunakannya echo $1 |.


18
2017-10-05 12:15



Juga: python -m base32 filename - kenorb
ini tidak bekerja :) tetapi gunakan .b32 * metode - rzr


Saya melakukan komentar baris perintah base64 di http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Jadi saya mengeluarkan Peringatan saat menggunakan decoding opensl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

PERINGATAN Panjang baris base64 dibatasi hingga 64 karakter secara default di openssl :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

=> TIDAK ADA!

untuk dapat memecahkan kode baris base64 tanpa feed baris yang melebihi 64 karakter menggunakan opsi -A:

openssl base64 -d -A <<<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

Welcome to openssl wiki with a very long line that splits...

Ini lebih baik untuk benar-benar membagi hasil base64 dalam 64 baris karakter karena opsi-A adalah BUGGY (batas dengan file panjang).


12
2018-03-23 18:23



@Sil, silakan atur ulang blok dengan benar, hasil edit Anda menggabungkan perintah openssl dengan komentar saya yang disisipkan. - philippe lhardy
Bisakah Anda memperbaikinya? Saya tidak dapat membedakan antara keduanya ... Saya akan mencoba, tetapi Anda mungkin perlu membantu saya ;-) - Seth♦
baik hanya harus melihat wiki.opensslfoundation.com/… di mana saya berhasil menggunakan sintaks wiki yang lebih baik (cari bas64 di halaman ini). - philippe lhardy


Menggunakan perl

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

Atau sama dengan python

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

4
2017-07-02 20:22





Hanya untuk menambahkan cara lain untuk melakukannya:

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

2
2018-06-15 06:27