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

david.libremone
sumber

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
Januari
sumber
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.
geirha
sumber
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.

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

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

philippe lhardy
sumber
4

Menggunakan perl

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

Atau sama dengan python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
sumber
2

Hanya dengan menambahkan cara lain untuk melakukannya:

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