Mengapa base64 string mengandung "\ n"?

84
$ echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64
YXBmanhraWMtb215dW9id2QzMzk4MDVhazo2MGEwNmNkMmRkZmFkNjEwYjk0OTBkMzU5ZDYwNTQw
Nw==

Output sudah kembali sebelumnya Nw==. Apa cara yang benar untuk menghasilkan base64 di Linux?

tangkapan layar terminal

Tiina
sumber
5
Apakah Anda yakin output berisi baris baru, dan bukan hanya pembungkus jendela Anda? Perintah itu bekerja dengan baik untuk saya di mac. OS apa yang Anda gunakan?
Ian
47
RFC 2045, yang mendefinisikan Base64, MEMBUTUHKAN baris baru setelah 76 karakter (maks). Apa yang membuat Anda berpikir bahwa teladan Anda bukanlah cara yang benar?
MSalters
24
@MSalters RFC 4648 secara khusus membahas masalah itu. Implementasi TIDAK HARUS menambahkan umpan baris ke data yang disandikan basis kecuali spesifikasi yang merujuk pada dokumen ini secara eksplisit mengarahkan pembuat enkode untuk menambahkan umpan baris setelah sejumlah karakter tertentu. => implementasi ini tidak benar menurut RFC 4648, asalkan ia mengklaim menghasilkan output yang di-encode base64. Yang lebih menarik, halaman manual GNU base64 (dalam pertanyaan?) Secara khusus mengacu pada RFC 3548, yang juga menentukan tidak ada pembungkus secara default, dan yang RFC 4648 usang.
Bob
4
@ Bob: RFC kurang menghormati stabilitas API; alat base64 tidak bisa hanya mengubah format output tanpa merusak skrip.
MSalters
2
@Malter Saya tidak dapat memastikan versi yang lebih lama tidak ada, tetapi GNU base64 ditulis pada tahun 2004 dan AFAICT selalu mengklaim mengikuti RFC 3548. RFC 3548 berisi klausul "HARUS TIDAK menambahkan umpan baris" yang sama. Jadi bahkan implementasi aslinya pun "salah". Paling tidak, implementasinya tidak sesuai dengan dokumentasinya. Bagaimanapun, Anda bertanya mengapa contoh OP benar dan mereferensikan RFC; tanggapan saya adalah RFC yang benar yang sebenarnya mendefinisikan base64 secara terpisah. Jika jawaban Anda adalah "karena alasan historis", ya, tapi OP tidak salah di sini.
Bob

Jawaban:

151

Mencoba:

echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 -w 0

Dari man base64:

-w, --wrap=COLS
Bungkus garis yang disandikan setelah COLSkarakter (default 76). Gunakan 0untuk menonaktifkan pembungkus baris.

Kamil Maciorowski
sumber
17
Ya ampun, aku selalu menyalurkan ini tr. Senang mengetahui ada "cara yang tepat".
Score_Di Bawah
Penjelasan tentang mengapa nilai default bukan nol adalah misteri bagi saya.
Dherik
1
@ Dherik Saya kira itu milik alat pengolahan teks. base64mengkodekan data biner acak sebagai teks. Alat yang mengharapkan teks biasanya membaca satu baris pada satu waktu dan mungkin tidak berurusan dengan garis yang sangat panjang dengan baik . Jika -w 0itu default, Anda akan mendapatkan secara default hanya satu baris teks; garis yang sangat panjang jika inputnya besar. Lebih baik untuk membungkus secara default. Saya pikir 76dipilih karena ini sedikit kurang dari 80yang merupakan semacam standar de-facto untuk terminal .
Kamil Maciorowski
@KamilMaciorowski terima kasih atas informasinya. Setiap kali saya menggunakan base64perintah yang saya butuhkan untuk lulus -w 0(dan ketika saya lupa, hal-hal aneh dapat terjadi ...), jadi perilaku default ini sangat aneh bagi saya.
Dherik
54

Ini lebih rendah daripada jawaban Kamil pada sistem yang mendukung -wopsi base64, tetapi untuk kasus-kasus ketika itu tidak tersedia (misalnya Alpine Linux, initramfshook Arch Linux , dll.), Anda dapat secara manual memproses output dari base64:

base64 some_file.txt | tr -d \\n

Ini adalah pendekatan brute-force; alih-alih membuat program untuk bekerja sama, saya menggunakan truntuk membongkar setiap baris baru di stdout.

Score_Under
sumber