Câu hỏi Làm thế nào để mã hóa base64 thông qua dòng lệnh?


Có một lệnh thiết bị đầu cuối trong Mac OS X mà sẽ base64 mã hóa một tập tin hoặc stdin?


158
2018-03-16 23:15


gốc


Lưu ý rằng mặc dù cú pháp mã hóa base64 nhất quán từ một hệ điều hành khác, cú pháp giải mã base64 là base64 -d hoặc là base64 -D tùy thuộc vào hệ điều hành của bạn. Sử dụng OSX -D. - Chris Johnson
@ChrisJohnson Nếu được sử dụng trong buổi hòa nhạc với openssl cờ để giải mã là -d trên OS X (10,10 Yosemite). - ᴠɪɴᴄᴇɴᴛ


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


openssl có thể làm điều này cho bạn và tất cả được cài đặt với OS X theo mặc định; không cần phải cài đặt darwinports.

$ openssl base64 -in <infile> -out <outfile>

Không có -in tùy chọn đọc từ stdin


175
2018-03-17 00:25



Sử dụng openssl base64 < path/to/file.png | tr -d '\n' | pbcopy hoặc là cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy để bỏ qua việc ghi vào một tệp và chỉ sao chép đầu ra được mã hóa base64 vào khay nhớ tạm mà không có ngắt dòng. - Mathias Bynens
Và sử dụng một -d gắn cờ để giải mã. - kenny
Trong mac, Để base64 mã hóa một chuỗi: openssl base64 -e <<< ram và giải mã: openssl base64 -d <<< cmFtCg== - Ram Patra
@mathias nếu bạn không muốn có dòng mới openssl base64 [-e] -A làm điều đó. + @kenny trên giải mã nếu đầu vào không có dòng mới mỗi 76 ký tự nhiều nhất, bao gồm cả trường hợp không-newlines tôi vừa nêu, bạn cần -d -Ahoặc bạn sẽ nhận được dữ liệu bị thiếu hoặc bị hỏng không có thông báo lỗi (mặc dù có một báo cáo lỗi đang chờ xử lý có thể dẫn đến việc sửa lỗi đó). - dave_thompson_085
@Ram, openssl base64 -e <<< ram thực sự mã hóa 4 byte, bao gồm một nguồn cấp dữ liệu dòng; xem hexdump <<< ram. - Arjan


Openssl có thể được sử dụng ngắn gọn hơn:

echo -n 'input' | openssl base64

[echo -n -> phải được sử dụng, hoặc mã hóa sẽ được thực hiện bao gồm cả ký tự dòng mới]

hoặc là

openssl base64 <ENTER> [type input] <CTRL+D>

61
2018-04-21 06:12



Các "echo" giải pháp thêm một LF (line feed) char đến cuối chuỗi đầu vào, mặc dù. Sử dụng tốt hơn: echo -n 'input' - SuperTempel
Và thậm chí ngắn gọn hơn một chút openssl base64 <<< input - Garrett Fogerlie
Hoặc chỉ sử dụng base64 không có openssl. Dù bằng cách nào, tôi cần phải nhấn Ctrl + D hai lần. Và hãy cẩn thận, @Garret: trong Bash, có hoặc không có openssl, openssl base64 <<< superuser và openssl base64 <<< "superuser"  sai lầm năng suất c3VwZXJ1c2VyCg==, như "chuỗi ở đây", sau đó vẫn bao gồm nguồn cấp dữ liệu dòng! (Hiển nhiên không chỉ trong Bash, mà còn trong zsh, ksh và yash. Xem hexdump <<< superuser. Kết quả Base64 phải là c3VwZXJ1c2Vy.) - Arjan
@Arjan Tôi ngần ngại sử dụng từ "sai" - như bạn đã chỉ ra, chuỗi ở đây bao gồm một nguồn cấp dữ liệu dòng, nhưng vì lý do chính đáng - unix.stackexchange.com/questions/20157/… . echo -n được ưu tiên nếu bạn không cần dòng mới. Nó chắc chắn là một cái gì đó để nhận thức được. - Steve Folly
Bạn đã có thể sử dụng printf thay cho echo -n - Jason S


Thử sử dụng:

base64 -i <in-file> -o <outfile>

Nó sẽ có sẵn theo mặc định trên OS X.


32
2018-02-27 20:13



Tuyệt quá. đơn giản và thanh lịch. Cảm ơn! - Leon li


base64 lệnh có sẵn theo mặc định trên OS X 10.9.4 của tôi.

Bạn có thể dùng base64 <<< string và base64 -D <<< string để mã hóa và giải mã một chuỗi trong thiết bị đầu cuối hoặc base64 -in file và base64 -D -in file để mã hóa và giải mã một tệp.


21
2018-03-17 02:48



Bạn có một ví dụ? tôi có Invalid characer in input stream khi đang sử dụng <<<... tôi đã thử với ", ' và không có gì xung quanh chuỗi. - Jonas
@ Jonas Bạn đang ở trong cái vỏ nào? Bạn có thể sử dụng nó trong bash và zsh. - WKPlus
Ah, không bao giờ, nó hoạt động! - Jonas


Vì Python được cung cấp với OS X theo mặc định, bạn có thể sử dụng nó như sau:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

Hoặc cài đặt coreutils thông qua Brew (brew install coreutils) sẽ cung cấp base64 chỉ huy:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO

6
2018-05-25 17:19





Về tốc độ, tôi sẽ sử dụng openssl theo sau là perl, tiếp theo là uuencode. Xét về tính di động, tôi sẽ sử dụng uuencode theo sau là Perl theo sau là openssl (Nếu bạn quan tâm đến việc sử dụng lại mã trên nhiều nền tảng UNIX như các nền tảng khác càng tốt). Hãy cẩn thận mặc dù vì không phải tất cả các biến thể UNIX đều hỗ trợ chuyển đổi -m (iirc AIX, HP / UX, Solaris không).

$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real    0m0.025s

$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real    0m0.051s

$  time openssl base64 -in out.jpg -out filename.b64 
real    0m0.017s

Sử dụng công tắc -m để chuyển mã uuencode file_in.txt trên mỗi base64 như được chỉ định bởi RFC1521 và ghi nó vào filename.b64 (với filename_when_uudecoded.txt làm tên tệp mặc định khi được giải mã):

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

Ví dụ về STDIN:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt

5
2017-09-05 07:43





Bạn cũng có thể ống nó ngay vào clipboard (ít nhất là trên mac):

openssl base64 -in [filename] | pbcopy


4
2017-07-12 15:39



chơi golf: base64 < [filename] | pbcopy - totels


uuencode -m [-o output_file] [file] name

Ở đâu Tên là tên để hiển thị trong tiêu đề được mã hóa.

Thí dụ:

cat docbook-xsl.css | uuencode -m docbook-xsl.css

hoặc là

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css

2
2018-04-04 20:12



uuencode không phải là mã hóa base64 - ccpizza


Đối với một số lý do, echo -n <data> | openssl base64 đã thêm một dòng mới ở giữa dữ liệu base64 của tôi. Tôi cho rằng đó là vì dữ liệu base64 của tôi thực sự rất dài.

Sử dụng echo -n <data> | base64 để mã hóa và echo -n <base64-ed data> | base64 -D để giải mã hoạt động tốt.


2
2017-07-27 05:16



nb: trên nix của tôi, tôi đã phải sử dụng -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword - mlo55


Có Perl cộng với MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

Điều này được cài đặt sẵn. Bạn có thể chỉ định các tệp riêng biệt trên dòng lệnh (hoặc cung cấp dữ liệu trên đầu vào tiêu chuẩn); mỗi tệp được mã hóa riêng. Bạn cũng có thể làm:

perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1

Điều này sao lưu file1 thành file1.txt và ghi đầu ra mã hóa Base-64 trên tập tin gốc.


1
2018-03-17 04:24





Một phiên bản NodeJS đơn giản:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"

1
2018-03-27 13:09



Tôi không nghĩ đây là câu trả lời hay hơn openssl (và bây giờ base64) đi kèm với hệ điều hành. - Josh
Có nguy cơ bị gãy lông - và, tôi biết rằng những lời chỉ trích này cũng áp dụng cho một vài câu trả lời khác - câu hỏi được hỏi làm thế nào để mã hóa một tập tin hoặc là stdin. Nếu tôi không nhầm, câu trả lời của bạn chỉ hiển thị cách mã hóa một chuỗi. - G-Man