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


216

Có một lệnh đầu cuối trong Mac OS X sẽ mã hóa 64 tập tin hoặc stdin không?


5
Xin lưu ý rằng mặc dù cú pháp mã hóa base64 nhất quán từ HĐH này sang HĐH khác, cú pháp giải mã base64 là base64 -dhoặc base64 -Dtùy thuộc vào hệ điều hành của bạn. OSX sử dụng -D.
Chris Johnson

@ChrisJohnson Nếu được sử dụng trong buổi hòa nhạc với opensslcờ để giải mã là -dtrên OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Câu trả lời:


230

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

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

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


79
Sử dụng openssl base64 < path/to/file.png | tr -d '\n' | pbcopyhoặc cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopybỏ qua việc ghi vào một tệp và chỉ sao chép đầu ra được mã hóa base64 vào bảng tạm mà không bị ngắt dòng.
Mathias Bynens

3
Và sử dụng một -dlá cờ để giải mã.
kenny

5
Trong mac, To base64 mã hóa một chuỗi: openssl base64 -e <<< ramvà để giải mã:openssl base64 -d <<< cmFtCg==
Ram Patra

8
@mathias nếu bạn muốn không có dòng mới openssl base64 [-e] -Anào làm điều đó. + @kenny khi giải mã nếu đầu vào không có dòng mới tối đa 76 ký tự, bao gồm cả trường hợp không có dòng mới tôi vừa nêu, bạn cần -d -Ahoặc bạn sẽ bị mất hoặc bị hỏng dữ liệu không có thông báo lỗi (mặc dù có báo cáo lỗi đang chờ xử lý có thể dẫn đến một sửa chữa cho điều đó).
dave_thndry_085

2
@Ram, openssl base64 -e <<< ramthực sự mã hóa 4 byte, bao gồm một nguồn cấp dữ liệu theo sau; thấy hexdump <<< ram.
Arjan

93

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>

10
Tuy nhiên, giải pháp "echo" sẽ thêm một char (đường cấp dữ liệu) vào cuối chuỗi đầu vào. Sử dụng tốt hơn: echo -n 'input'
SuperTempel

8
Và thậm chí ngắn gọn hơn một chútopenssl base64 <<< input
Garrett Fogerlie

2
Hoặc chỉ sử dụng base64mà không có openssl. Dù bằng cách nào, tôi cần nhấn Ctrl + D hai lần. Và hãy cẩn thận, @Garret: trong Bash, có hoặc không openssl, openssl base64 <<< superuservà mang lại kết quả openssl base64 <<< "superuser" saic3VwZXJ1c2VyCg== , vì "chuỗi ở đây" sau đó vẫn bao gồm một nguồn cấp dữ liệu! ( Rõ ràng không chỉ ở Bash, mà cả zsh, ksh và yash. Xem hexdump <<< superuser. Kết quả Base64 sẽ là c3VwZXJ1c2Vy.)
Arjan

@Arjan Tôi ngại sử dụng từ "một cách sai lầm" - như bạn đã chỉ ra, chuỗi ở đây bao gồm một nguồn cấp dữ liệu, nhưng vì lý do chính đáng - unix.stackexchange.com/questions/20157/ . echo -nđược ưa thích nếu bạn không cần dòng mới. Đó chắc chắn là một cái gì đó để nhận thức.
Steve Folly

2
Bạn có thể sử dụng printfthay choecho -n
Jason S

50

Hãy thử sử dụng:

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

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


1
Thêm --decodeđể đảo ngược quá trình từ cơ sở64 sang bình thường.
luckydonald

1
Điều này tốt hơn cho mã hóa cho SVG vì nó tạo ra một dòng. Điều này là sạch hơn so với đầu ra từ openssl base64. Cảm ơn!
Shanimal

32

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ể sử dụng base64 <<< stringbase64 -D <<< stringđể mã hóa và giải mã một chuỗi trong nhà ga, hay base64 -in filebase64 -D -in fileđể mã hóa và giải mã một tập tin.


Bạn có một ví dụ? Tôi nhận được Invalid characer in input streamkhi 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 điều này trong bash và zsh.
WKPlus

Ah, đừng bận tâm, nó hoạt động!
Jonas

8

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

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

Hoặc cài đặt coreutilsqua Brew ( brew install coreutils) sẽ cung cấp base64lệnh:

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

5

Về tốc độ, tôi sẽ sử dụng openssl theo sau là perl, tiếp theo là uuencode. Về tính di động, tôi sẽ sử dụng uuencode theo sau là Perl và theo sau là openssl (Nếu bạn quan tâm đến việc sử dụng lại mã trên càng nhiều nền tảng UNIX khác như nền tảng chứng khoán càng tốt). Mặc dù vậy, hãy cẩn thận vì không phải tất cả các biến thể UNIX đều hỗ trợ chuyển đổi -m (iirc AIX có, HP / UX không, 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 chuyển đổi -m sang uuencode file_in.txt trên cơ sở64 như được chỉ định bởi RFC1521 và ghi nó vào filename.b64 (với filename_when_uudecoding.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ụ STDIN:

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

5

Bạn cũng có thể đặt nó ngay vào bảng tạm (ít nhất là trên mac):

openssl base64 -in [filename] | pbcopy


chơi gôn:base64 < [filename] | pbcopy
totels

5

Trên macOS tôi luôn sử dụng:

echo -n "STRING" | base64

-n là để tránh một ký tự dòng mới ở cuối dòng.


3

Con trăn

Python được cài đặt sẵn trên tất cả các máy Mac hiện nay.

Trong Terminal chạy python(hoặc ipython ).

Mã hóa một tập tin:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

Giải mã một tập tin:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

Tất nhiên, cả hai hoạt động có thể được chuyển đổi thành một oneliner nhưng theo cách này nó dễ đọc hơn.

OpenSSL

## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64

## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64


## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg

## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg

Bỏ qua -out/ -output... filenamesẽ in ra thiết bị xuất chuẩn.

cơ sở64

Một tiện ích ootb khác có trong cả OSX và Ubuntu:

## encode to base64
base64 < myfile.jpg > myfile.jpg.b64

## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg

## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg

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

Trong đó 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

uuencodekhông phải là mã hóa nhưbase64
ccpizza

2

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

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


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

2

Ngoài câu trả lời của Steve Folly ở trên, khi mã hóa ở chế độ stdin, để tránh vượt qua các dòng mới, hãy nhấn CTRL + D hai lần để kết thúc đầu vào mà không cần thêm dòng mới nào. Đầu ra sẽ hiển thị ngay sau cùng một dòng.

Ví dụ:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

Ngoài ra, bạn có thể sử dụng printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

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 biệt. 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 được mã hóa Base-64 lên trên tệp gốc.


1

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

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

Tôi không nghĩ rằng đây là một câu trả lời tốt hơn vì openssl(và bây giờ base64) đi kèm với HĐH.
Josh

Có nguy cơ bị chẻ sợi tóc - và, tôi biết rằ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 hỏi làm thế nào để mã hóa một tập tin hoặc 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 chuỗi.
G-Man

1

recode nên làm thủ thuật cho bạn

recode ../b64 < file.txt > file.b64

recode có sẵn cho OS X thông qua MacPorts .


Không có gì được xây dựng trong?
Josh

@Josh - có - openssl
Steve Folly

MacPorts không đi kèm với bất kỳ phân phối OS X nào. Có rất nhiều lựa chọn khác mà làm. Ví dụ chỉ cần base64lệnh.
Jason S

1

Nếu bạn đang mã hóa base64 một tệp phông chữ, bạn có thể làm điều này:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

Tôi sử dụng điều này trên máy Mac (10.10) mọi lúc.

Lưu ý : Sẽ không có ngắt dòng.


1

Giải pháp đa nền tảng

Chúng tôi đã biên soạn một danh sách các lệnh shell đa nền tảng để mã hóa một tệp dưới dạng base64. Các lệnh sau lấy một tệp đầu vào (được đặt tên deploy.keytrong các ví dụ) và chuyển đổi nó thành base64 mà không có bất kỳ gói mới nào. Đầu ra base64 được in tới thiết bị đầu cuối thông qua thiết bị xuất chuẩn.

# For systems with openssl
openssl base64 -A -in=deploy.key

# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"

# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key

# For macOS systems
base64 --break=1000000 deploy.key

Để chuyển hướng đầu ra thành một tệp, hãy nối thêm > base64-encoded.txt(sử dụng tên tệp bạn chọn).

Các lệnh này được tạo nguyên mẫu như một phần của yêu cầu kéo này , nơi chúng tôi muốn các lệnh shell đa nền tảng để base64 mã hóa khóa riêng SSH để xóa dòng mới.

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.