Bagaimana saya bisa mendekode string base64 dari baris perintah?


426

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

Sejauh ini saya telah mencoba file bash sederhana yang berisi python -m base64 -d $1tetapi perintah ini mengharapkan nama file bukan string. Apakah ada perintah non-interaktif lain (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.)

Jawaban:


630

Cukup gunakan base64program dari coreutilspaket:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Atau, untuk memasukkan karakter baris baru

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

output (termasuk baris baru):

Aladdin:open sesame

10
Atau: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
— Greg Chabala

61
Atau:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
— jmk

4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtDi Windows dengan base64 git.
— Api

3
@ January Tidak Just use, karena banyak orang tahu tentang base64program - tetapi karena seseorang tidak bisa hanya memasukkan string sebagai opsi baris perintah, sulit untuk mendapatkan sintaks yang tepat untuk pengguna yang menyentuh CLI hanya sesekali.
— feeela

12
Di Mac, salin string yang disandikan ke clipboard dan jalankan pbpaste | base64 --decode.
— Marián Černý

95

openssl juga dapat menyandikan dan mendekode base64

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

EDIT: Contoh di mana string yang disandikan 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.

8
Berkat jawaban Philippe, Anda perlu menambahkan -A untuk string base64 yang panjang jika tidak, openssl tidak akan menghasilkan
— morloch

@morloch atau hindari menghapus baris baru dari data yang disandikan base64, dan berfungsi seperti yang diharapkan ...
— geirha

1
Saya tidak akan mempertimbangkan coreutilssebuah "tambahan" paket yang berisi program-program seperti ls, mkdir, cp, mv, dan chmod. Saya ragu Anda dapat melakukan apa pun 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

1
Meskipun ini adalah pertukaran tumpukan ubuntu, menggunakan opensslmemiliki keunggulan dibandingkan standar base64bekerja di Git Bash pada Windows, setidaknya versi 1.8.1 Git Bash yang lebih lama telah saya instal.
— willkil

38

Ini dia!

Tambahkan berikut ini ke bagian bawah ~/.bashrcfile Anda :

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

Sekarang, buka Terminal baru dan jalankan perintah.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ini akan melakukan apa yang Anda minta dalam pertanyaan Anda.


20

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

echo $1 | python -m base64 -d

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


1
Juga: nama file python -m base32
— kenorb

1
ini tidak berhasil :) tetapi gunakan metode .b32 *
— rzr

13

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

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

panjang dasar base64 peringatan 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 garis base64 tanpa umpan baris yang melebihi 64 karakter gunakan opsi -A:

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

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

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


4

Menggunakan perl

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

Atau sama dengan python

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

2

Hanya dengan menambahkan cara lain untuk melakukannya:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.