Bagaimana cara menyandikan base64 melalui baris perintah?

217

Apakah ada perintah terminal di Mac OS X yang akan base64 menyandikan file atau stdin?

Josh
sumber
5
Ketahuilah bahwa meskipun sintaksis pengkodean base64 konsisten dari satu OS ke OS lain, sintaksis dekode base64 adalah salah satu base64 -datau base64 -Dtergantung pada sistem operasi Anda. Penggunaan OSX -D.
Chris Johnson
@ChrisJohnson Jika digunakan bersama dengan opensslbendera untuk decoding ada -ddi OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Jawaban:

231

openssldapat melakukan ini untuk Anda, dan semuanya diinstal dengan OS X secara default; tidak perlu menginstal darwinports.

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

Tanpa -inopsi membaca dari stdin

Steve Folly
sumber
79
Gunakan openssl base64 < path/to/file.png | tr -d '\n' | pbcopyatau cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopyuntuk lewati menulis ke file dan cukup salin output yang disandikan base64 ke clipboard tanpa jeda baris.
Mathias Bynens
3
Dan gunakan -dbendera untuk memecahkan kode.
kenny
5
Di mac, To base64 menyandikan string: openssl base64 -e <<< ramdan untuk mendekode:openssl base64 -d <<< cmFtCg==
Ram Patra
8
@mathias jika Anda ingin tidak ada baris baru openssl base64 [-e] -Amelakukannya. + @kenny pada decode jika input tidak memiliki baris baru setiap 76 karakter paling banyak, termasuk kasus no-baris baru yang saya sebutkan, Anda perlu -d -Aatau Anda akan mendapatkan data yang hilang atau rusak tanpa pesan kesalahan (walaupun ada laporan bug yang tertunda yang dapat menyebabkan perbaikan untuk itu).
dave_thompson_085
2
@ Ray, openssl base64 -e <<< ramsebenarnya mengkodekan 4 byte, termasuk feed garis trailing; lihat hexdump <<< ram.
Arjan
93

Openssl dapat digunakan dengan lebih ringkas:

echo -n 'input' | openssl base64

[echo -n -> harus digunakan, atau pengkodean akan dilakukan termasuk karakter baris baru]

atau

openssl base64 <ENTER> [type input] <CTRL+D>
Lembah kecil
sumber
10
Solusi "echo" menambahkan char LF (line feed) di akhir string input. Penggunaan yang lebih baik: echo -n 'input'
SuperTempel
8
Dan bahkan sedikit lebih ringkasopenssl base64 <<< input
Garrett Fogerlie
2
Atau gunakan saja base64tanpa openssl. Either way, saya perlu menekan Ctrl + D dua kali. Dan berhati-hatilah, @ Garret: di Bash, dengan atau tanpa openssl, openssl base64 <<< superuserdan openssl base64 <<< "superuser" salah menghasilkan c3VwZXJ1c2VyCg==, sebagai "string di sini" maka masih termasuk umpan baris! ( Rupanya tidak hanya di Bash, tetapi juga di zsh, ksh dan yash. Lihat hexdump <<< superuser. Hasil Base64 seharusnya c3VwZXJ1c2Vy.)
Arjan
@Arjan Saya ragu menggunakan kata "keliru" - seperti yang Anda tunjukkan, string di sini menyertakan umpan baris, tetapi untuk alasan yang baik - unix.stackexchange.com/questions/20157/… . echo -nlebih disukai jika Anda tidak memerlukan baris baru. Ini tentu sesuatu yang harus diperhatikan.
Steve Folly
2
Anda dapat menggunakannya printfsebagai penggantiecho -n
Jason S
50

Coba gunakan:

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

Ini harus tersedia secara default pada OS X.

Derreck Dean
sumber
1
Tambahkan --decodeuntuk membalikkan proses dari base64 ke normal.
luckydonald
1
Ini lebih baik untuk penyandian untuk SVG karena ini menciptakan satu baris. Ini lebih bersih daripada keluaran dari openssl base64. Terima kasih!
Shanimal
32

base64 perintah tersedia secara default di OS X saya 10.9.4.

Anda dapat menggunakan base64 <<< stringdan base64 -D <<< stringuntuk menyandikan dan mendekode string dalam terminal, atau base64 -in filedan base64 -D -in fileuntuk menyandikan dan mendekode file.

WKPlus
sumber
Apakah kamu punya contoh? Saya dapatkan Invalid characer in input streamketika menggunakan <<<... Saya telah mencoba ", 'dan tidak ada di sekitar string.
Jonas
@Jonas Apa shell kamu? Anda dapat menggunakan ini di bash dan zsh.
WKPlus
Ah, tidak apa-apa, itu berhasil!
Jonas
8

Karena Python disediakan dengan OS X secara default, Anda dapat menggunakannya sebagai berikut:

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

Atau instal coreutilsmelalui Brew ( brew install coreutils) yang akan memberikan base64perintah:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
kenorb
sumber
6

Di macOS saya selalu menggunakan:

echo -n "STRING" | base64

-n adalah untuk menghindari karakter baris baru di akhir baris.

patrick
sumber
5

Dalam hal kecepatan, saya akan menggunakan openssl diikuti oleh perl, diikuti oleh uuencode. Dalam hal portabilitas, saya akan menggunakan uuencode diikuti oleh Perl diikuti oleh openssl (Jika Anda ingin menggunakan kembali kode pada banyak UNIX lain seperti platform saham mungkin). Berhati-hatilah karena tidak semua varian UNIX mendukung -m switch (iirc AIX, HP / UX, Solaris tidak).

$ 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

Gunakan -m beralih ke uuencode file_in.txt per base64 seperti yang ditentukan oleh RFC1521 dan menulisnya ke namafile.b64 (dengan namafile_when_uudecoded.txt sebagai nama file default ketika diterjemahkan):

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

Contoh STDIN:

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

Anda juga dapat menyalurkannya langsung ke clipboard (setidaknya di mac):

openssl base64 -in [filename] | pbcopy

Steve
sumber
bermain golf:base64 < [filename] | pbcopy
totel
3

Python

Python sudah diinstal pada semua mac saat ini.

Di Terminal run python(atau ipython ).

Encode file:

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

Dekode file:

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

Tentu saja, kedua operasi dapat dikonversi menjadi oneliner tetapi dengan cara ini lebih mudah dibaca.

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

Menghilangkan -out/ -output... filenameakan mencetak ke stdout.

base64

Utilitas ootb lain hadir baik di OSX dan 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
ccpizza
sumber
2
uuencode -m [-o output_file] [file] name

Di mana nama adalah nama untuk ditampilkan di header yang disandikan.

Contoh:

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

atau

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
pengguna214207
sumber
uuencodebukan penyandian sebagaibase64
ccpizza
2

Untuk beberapa alasan, echo -n <data> | openssl base64menambahkan baris baru di tengah data base64 saya. Saya berasumsi itu karena data base64 saya sangat panjang.

Menggunakan echo -n <data> | base64untuk menyandikan dan echo -n <base64-ed data> | base64 -Dmendekode bekerja dengan baik.

Perbatasan Heath
sumber
nb: di nix saya, saya harus menggunakan -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55
2

Selain jawaban Steve Folly di atas, ketika mengenkripsi dalam mode stdin, untuk menghindari melewati baris baru, tekan CTRL + D dua kali untuk mengakhiri input tanpa ada baris baru tambahan. Output akan ditampilkan tepat setelah baris yang sama.

Sebagai contoh:

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

Atau, Anda dapat menggunakan printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
bigT
sumber
1

Ada Perl plus MIME :: Base64:

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

Ini sudah diinstal sebelumnya. Anda dapat menentukan file terpisah pada baris perintah (atau menyediakan data pada input standar); setiap file dikodekan secara terpisah. Anda juga dapat melakukan:

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

Ini mencadangkan file1 ke file1.txt, dan menulis output yang disandikan Base-64 di atas file asli.

Jonathan Leffler
sumber
1

Versi NodeJS sederhana:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauvm
sumber
Saya tidak berpikir ini adalah jawaban yang lebih baik karena openssl(dan sekarang base64) datang dengan OS.
Josh
Dengan risiko rambut membelah - dan, saya menyadari bahwa kritik ini berlaku untuk beberapa jawaban lain, juga - pertanyaan yang diajukan bagaimana cara menyandikan file atau stdin . Jika saya tidak salah, jawaban Anda hanya menunjukkan cara menyandikan string.
G-Man
1

recode harus melakukan trik untuk Anda

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

recode tersedia untuk OS X melalui MacPorts .

astaga
sumber
Tidak ada yang terpasang?
Josh
@Josh - ada - openssl
Steve Folly
MacPorts tidak disertai dengan distribusi OS X. Ada banyak opsi lain yang bisa dilakukan. Misalnya hanya base64perintah.
Jason S
1

Jika Anda melakukan encoding file font pada base64, Anda dapat melakukan ini:

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

Saya menggunakan ini pada Mac (10.10) sepanjang waktu.

Catatan : Tidak akan ada linebreak.

Chuck Ugwuh
sumber
1

Solusi lintas platform

Kami menyusun daftar perintah shell lintas-platform untuk menyandikan file sebagai base64. Perintah berikut mengambil file input (disebutkan deploy.keydalam contoh) dan mengubahnya menjadi base64 tanpa pembungkus baris baru. Output base64 dicetak ke terminal melalui stdout.

# 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

Untuk mengarahkan output ke file, tambahkan > base64-encoded.txt(menggunakan nama file yang Anda pilih).

Perintah-perintah ini di-prototipe sebagai bagian dari permintaan tarikan ini di mana kami ingin perintah shell lintas-platform ke base64 menyandikan kunci pribadi SSH untuk menghapus baris baru.

Daniel Himmelstein
sumber