Làm thế nào tôi có thể giải mã một chuỗi base64 từ dòng lệnh?


426

Tôi muốn viết một tập lệnh bash để giải mã chuỗi base64. Ví dụ tôi gõ decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==và nó in Aladdin:open sesamevà trở về dấu nhắc.

Cho đến nay tôi đã thử một tệp bash đơn giản có chứa python -m base64 -d $1nhưng lệnh này hy vọng tên tệp không phải là một chuỗi. Có một lệnh không tương tác nào khác (không nhất thiết phải có trong mô-đun Python) mà tôi có thể chạy từ dòng lệnh để đạt được điều này mà không phải cài đặt thêm gói nào không? (Hoặc nếu tôi làm, một cái gì đó siêu tối thiểu.)

Câu trả lời:


630

Chỉ cần sử dụng base64chương trình từ coreutilsgói:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Hoặc, để bao gồm ký tự dòng mới

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

đầu ra (bao gồm dòng mới):

Aladdin:open sesame

10
Hoặc: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | cơ sở64 - mã hóa && echo
Greg Chabala

61
Hoặc:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk

4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtTrên Windows với cơ sở64 của git.
Cháy

3
@January Nó không phải là Just use, bởi vì nhiều người biết về base64chương trình - nhưng như người ta không thể chỉ chèn một chuỗi như tùy chọn dòng lệnh, rất khó để có được đúng cú pháp cho những người dùng chạm vào CLI chỉ một lần trong một thời gian.
feeela

12
Trên Mac, sao chép chuỗi được mã hóa vào clipboard và chạy pbpaste | base64 --decode.
Marián erný

95

openssl cũng có thể mã hóa và giải mã cơ sở64

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

EDIT: Một ví dụ trong đó chuỗi được mã hóa base64 kết thúc trên nhiều dòng:

$ 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
Nhờ câu trả lời của Philippe, bạn cần thêm -A cho chuỗi cơ sở dài 64 nếu không openssl sẽ không trả lại được gì, hãy xem Askubfox.com/a/271676/305568
morloch

@morloch hoặc chỉ cần tránh xóa các dòng mới khỏi dữ liệu được mã hóa base64 và nó hoạt động như mong đợi ...
geirha

1
Tôi sẽ không xem xét coreutilsmột gói "bổ sung" có chứa các chương trình như ls, mkdir, cp, mv, và chmod. Tôi nghi ngờ bạn có thể làm bất cứ điều gì hữu ích với máy của bạn mà không cần nó.
vidstige

@vidstige, đó là sự thật. Tôi không biết tại sao tôi lại có ấn tượng rằng Base64 không được cài đặt theo mặc định; đó là hoàn toàn không phải là trường hợp.
geirha

1
Mặc dù đây là trao đổi ngăn xếp Ubuntu, nhưng việc sử dụng opensslcó lợi thế hơn so với tiêu chuẩn base64làm việc trong Git Bash trên Windows, ít nhất là phiên bản 1.8.1 Git Bash cũ hơn mà tôi đã cài đặt.
willkil

38

Bạn đi đây!

Thêm phần sau vào dưới cùng của ~/.bashrctệp của bạn :

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

Bây giờ, mở Terminal mới và chạy lệnh.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Điều này sẽ làm chính xác những gì bạn yêu cầu trong câu hỏi của bạn.


20

Với các phụ thuộc ban đầu của bạn, có thể thực hiện việc này với một sửa đổi nhỏ cho tập lệnh gốc của bạn:

echo $1 | python -m base64 -d

Nếu bạn không vượt qua tên tệp, mô-đun python đó sẽ đọc từ đầu vào tiêu chuẩn. Để đặt tham số đầu tiên vào nó, bạn có thể sử dụng echo $1 |.


1
Ngoài ra: tên tệp python -m base32
kenorb

1
điều này không hoạt động :) nhưng sử dụng các phương thức .b32 *
rzr

13

Tôi đã nhận xét dòng lệnh base64 trong http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Vì vậy, tôi đưa ra Cảnh báo khi sử dụng giải mã openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

cảnh báo dài dòng base64 được giới hạn 64 ký tự mặc định trong openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

=> KHÔNG CÓ!

để có thể giải mã một dòng base64 mà không cần nguồn cấp vượt quá 64 ký tự, hãy sử dụng tùy chọn -A:

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

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

Điều này tốt hơn hết là phân chia base64 thực tế trong 64 dòng ký tự vì tùy chọn -A là BUGGY (giới hạn với các tệp dài).


4

Sử dụng perl

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

Hoặc tương tự với python

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

2

Chỉ cần thêm một cách khác để làm điều đó:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.