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


Tôi muốn viết một kịch bản bash để giải mã một chuỗi base64. Ví dụ tôi gõ decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== và nó in Aladdin:open sesame và 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 $1 nhưng lệnh này dự kiến ​​một tên tập tin không phải là một chuỗi. Có một lệnh không tương tác (không nhất thiết phải trong một mô-đun Python) mà tôi có thể chạy từ dòng lệnh để đạt được điều này, mà không cần phải cài đặt thêm bất kỳ gói nào? (Hoặc nếu tôi làm, một cái gì đó siêu tối thiểu.)


320
2017-08-21 12:17


gốc




Các câu trả lời:


Chỉ cần sử dụng base64 chương trình từ coreutils gó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

484
2017-08-21 13:34



Hoặc: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Hoặc là: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Trên Windows với base64 của git. - Fire
@January Nó không phải là Just use, bởi vì nhiều người biết về base64 chương trình - nhưng không thể chỉ chèn một chuỗi như tùy chọn dòng lệnh, rất khó để có được cú pháp đúng cho người dùng chỉ chạm vào CLI một lần trong một thời gian. - feeela
Trên máy Mac, sao chép chuỗi được mã hóa vào clipboard và chạy pbpaste | base64 --decode. - Marián Černý


openssl cũng có thể mã hóa và giải mã base64

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

EDIT: 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.

75
2017-08-21 22:23



Nhờ câu trả lời của Philippe, bạn cần thêm -A cho chuỗi base64 dài nếu không openssl sẽ không trả về gì cả, hãy xem askubuntu.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
Tôi sẽ không xem xét coreutils gói "bổ sung" chứa các chương trình như ls, mkdir, cp, mvvà chmod. Tôi nghi ngờ bạn có thể làm bất cứ điều gì hữu ích với máy tính của bạn mà không có nó. - vidstige
@ vidstige, đó là sự thật. Tôi không biết tại sao tôi đã theo ấn tượng rằng base64 không được cài đặt theo mặc định; đó hoàn toàn không phải là trường hợp. - geirha
Trong khi đây là trao đổi ngăn xếp ubuntu, sử dụng openssl có lợi thế so với tiêu chuẩn base64 làm việc trong Git Bash trên Windows, ít nhất phiên bản Git Bash 1.8.1 cũ hơn mà tôi đã cài đặt. - willkil


Ở đây bạn đi!

Thêm phần sau vào cuối ~/.bashrc tập tin:

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

Bây giờ, mở một 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.


32
2017-08-21 13:39





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

echo $1 | python -m base64 -d

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


18
2017-10-05 12:15



Ngoài ra: python -m base32 filename - kenorb
điều này không hoạt động :) nhưng sử dụng phương thức .b32 * - rzr


Tôi đã bình luận 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ã opens64 base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

cảnh báo chiều dài dòng base64 được giới hạn trong 64 ký tự theo 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=='

=> NOTHING!

để có thể giải mã dòng base64 mà không có nguồn cấp dữ liệu dòng 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 là tốt hơn để thực tế chia 64 kết quả trong 64 dòng ký tự kể từ khi -A tùy chọn là BUGGY (giới hạn với các tập tin dài).


12
2018-03-23 18:23



@ Xin vui lòng đặt lại các khối chính xác, lệnh chỉnh sửa đã mở của bạn đã được hợp nhất với các nhận xét xen kẽ của tôi. - philippe lhardy
Bạn có thể sửa nó không? Tôi không thể phân biệt giữa hai ... Tôi sẽ cố gắng, nhưng bạn có thể cần phải giúp tôi ra ;-) - Seth♦
cũng chỉ cần có một cái nhìn về wiki.opensslfoundation.com/… nơi tôi quản lý để sử dụng cú pháp wiki tốt hơn (tìm kiếm bas64 trong trang này). - philippe lhardy


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=="

4
2017-07-02 20:22





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 ": ")))'

2
2018-06-15 06:27