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.
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]
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
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.
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:
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):
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
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.
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.
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:
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.
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.
base64 -d
ataubase64 -D
tergantung pada sistem operasi Anda. Penggunaan OSX-D
.openssl
bendera untuk decoding ada-d
di OS X (10.10 Yosemite).Jawaban:
openssl
dapat melakukan ini untuk Anda, dan semuanya diinstal dengan OS X secara default; tidak perlu menginstal darwinports.Tanpa
-in
opsi membaca dari stdinsumber
openssl base64 < path/to/file.png | tr -d '\n' | pbcopy
ataucat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy
untuk lewati menulis ke file dan cukup salin output yang disandikan base64 ke clipboard tanpa jeda baris.-d
bendera untuk memecahkan kode.openssl base64 -e <<< ram
dan untuk mendekode:openssl base64 -d <<< cmFtCg==
openssl base64 [-e] -A
melakukannya. + @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 -A
atau Anda akan mendapatkan data yang hilang atau rusak tanpa pesan kesalahan (walaupun ada laporan bug yang tertunda yang dapat menyebabkan perbaikan untuk itu).openssl base64 -e <<< ram
sebenarnya mengkodekan 4 byte, termasuk feed garis trailing; lihathexdump <<< ram
.Openssl dapat digunakan dengan lebih ringkas:
[echo -n -> harus digunakan, atau pengkodean akan dilakukan termasuk karakter baris baru]
atau
sumber
openssl base64 <<< input
base64
tanpaopenssl
. Either way, saya perlu menekan Ctrl + D dua kali. Dan berhati-hatilah, @ Garret: di Bash, dengan atau tanpaopenssl
,openssl base64 <<< superuser
danopenssl base64 <<< "superuser"
salah menghasilkanc3VwZXJ1c2VyCg==
, sebagai "string di sini" maka masih termasuk umpan baris! ( Rupanya tidak hanya di Bash, tetapi juga di zsh, ksh dan yash. Lihathexdump <<< superuser
. Hasil Base64 seharusnyac3VwZXJ1c2Vy
.)echo -n
lebih disukai jika Anda tidak memerlukan baris baru. Ini tentu sesuatu yang harus diperhatikan.printf
sebagai penggantiecho -n
Coba gunakan:
Ini harus tersedia secara default pada OS X.
sumber
--decode
untuk membalikkan proses dari base64 ke normal.openssl base64
. Terima kasih!base64
perintah tersedia secara default di OS X saya 10.9.4.Anda dapat menggunakan
base64 <<< string
danbase64 -D <<< string
untuk menyandikan dan mendekode string dalam terminal, ataubase64 -in file
danbase64 -D -in file
untuk menyandikan dan mendekode file.sumber
Invalid characer in input stream
ketika menggunakan<<<
... Saya telah mencoba"
,'
dan tidak ada di sekitar string.Karena Python disediakan dengan OS X secara default, Anda dapat menggunakannya sebagai berikut:
Atau instal
coreutils
melalui Brew (brew install coreutils
) yang akan memberikanbase64
perintah:sumber
Di macOS saya selalu menggunakan:
echo -n "STRING" | base64
-n adalah untuk menghindari karakter baris baru di akhir baris.
sumber
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).
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):
Contoh STDIN:
sumber
Anda juga dapat menyalurkannya langsung ke clipboard (setidaknya di mac):
openssl base64 -in [filename] | pbcopy
sumber
base64 < [filename] | pbcopy
Python
Python sudah diinstal pada semua mac saat ini.
Di Terminal run
python
(atau ipython ).Encode file:
Dekode file:
Tentu saja, kedua operasi dapat dikonversi menjadi oneliner tetapi dengan cara ini lebih mudah dibaca.
OpenSSL
Menghilangkan
-out
/-output... filename
akan mencetak ke stdout.base64
Utilitas ootb lain hadir baik di OSX dan Ubuntu:
sumber
Di mana nama adalah nama untuk ditampilkan di header yang disandikan.
Contoh:
atau
sumber
uuencode
bukan penyandian sebagaibase64
Untuk beberapa alasan,
echo -n <data> | openssl base64
menambahkan baris baru di tengah data base64 saya. Saya berasumsi itu karena data base64 saya sangat panjang.Menggunakan
echo -n <data> | base64
untuk menyandikan danecho -n <base64-ed data> | base64 -D
mendekode bekerja dengan baik.sumber
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:
Atau, Anda dapat menggunakan
printf
:sumber
Ada Perl plus MIME :: 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:
Ini mencadangkan file1 ke file1.txt, dan menulis output yang disandikan Base-64 di atas file asli.
sumber
Versi NodeJS sederhana:
sumber
openssl
(dan sekarangbase64
) datang dengan OS.recode harus melakukan trik untuk Anda
recode tersedia untuk OS X melalui MacPorts .
sumber
base64
perintah.Jika Anda melakukan encoding file font pada base64, Anda dapat melakukan ini:
Saya menggunakan ini pada Mac (10.10) sepanjang waktu.
Catatan : Tidak akan ada linebreak.
sumber
Solusi lintas platform
Kami menyusun daftar perintah shell lintas-platform untuk menyandikan file sebagai base64. Perintah berikut mengambil file input (disebutkan
deploy.key
dalam contoh) dan mengubahnya menjadi base64 tanpa pembungkus baris baru. Output base64 dicetak ke terminal melalui stdout.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.
sumber