Cara menghindari data biner untuk dimasukkan ke dalam skrip bash


1

Saya ingin membuat skrip bash yang membaca "payload" data biner dari file eksternal dan memuntahkan skrip bash lain dengan data ini lolos dan dikemas dalam variabel string. Contoh:

  • mydata.bin - Sumber data: file data biner yang akan dienkapsulasi
  • myencoder.sh - Pelaku utama: skrip bash yang mengubah data biner menjadi skrip dengan variabel string
  • mypayload.sh - Hasil akhirnya: skrip bash yang dihasilkan oleh myencoder.sh yang berisi data yang disandikan sebagai variabel string.

Untuk menggunakan ini saya akan menjalankan myscript.sh mydata.bin mypayload.sh dan myscript.sh akan mengonversi / escape / wrap / apa pun file mydata.bin ke mypayload.sh

Setelah menjalankan perintah ini, the mypayload.sh File akan terlihat seperti ini:

# Generated by myencoder.sh with data from mydata.bin
encoded_data="[...]ugly escaped string representation of the binary data found in mydata.bin[...]"

Masalah yang saya hadapi yang saya tidak yakin bagaimana menyelesaikannya adalah bagaimana data akan dikodekan dengan benar. Saya membaca bahwa printf "% q" dapat digunakan untuk keluar dari string, tetapi bagaimana memintanya pada data yang diambil dari file biner eksternal benar-benar menghindar dari saya.

Jadi tolong, setiap tusukan ini dan tips apapun dipersilakan!

PS: Saya tidak ingin memperkenalkan dependensi di luar bash jika memungkinkan. Tergantung pada bash 4.x fitur-fiturnya OK.

PPS: Encoding harus mendukung ukuran kecil dan kinerja encoding / decoding.


Melarikan data biner di skrip Anda terdengar sulit. Sudahkah Anda melihat ke sini dokumen untuk melakukan hal yang sama? tldp.org/LDP/abs/html/here-docs.html
Mogget

Data Bash tidak dapat berisi byte nol. Gunakan alat eksternal.
choroba

@ Magget: Saya tidak yakin bagaimana heredocs akan membantu sama sekali. Saya masih perlu melarikan diri, dan jika itu tidak mungkin tidak ada solusi.
Lennart Rolland

Jawaban:


1

Sangat sulit untuk menangani nol byte dari bash. Anda dapat menghasilkan byte nol dengan

printf %c

tetapi Anda tidak dapat menyimpannya dalam variabel.

Jauh lebih mudah menggunakan alat eksternal:

xxd < mydata.bin > encoded
xxd -r < encoded > binary

1

Ini bukan solusi lengkap untuk masalah Anda; seperti yang orang lain sebutkan berurusan dengan NULLs di file input Anda sulit di bash, dan saya yakin potensi file input unicode dapat menyebabkan lebih banyak sakit kepala.

Tapi saya menaruh sedikit waktu untuk memikirkan bagaimana Anda dapat menggunakannya printf %q di bash untuk melakukan sesuatu yang mirip dengan saran Anda dan muncul dengan hack cepat ini:

echo -n 'myvar="'
while read -r; do
  if [ ! -z "$REPLY" ]; then
    printf %q "$REPLY"
  fi
  echo -n '\n'
done
echo '"'

Saya yakin itu bisa pecah dalam banyak hal tapi mungkin itu bisa memuaskan rasa ingin tahu Anda.


0

Balasan ini tidak menjawab pertanyaan secara langsung karena tampaknya mengandung 0 byte dalam variabel bash tidak mungkin dan tampaknya tidak ada cara untuk melarikan mereka ke string yang dapat disimpan dengan aman di dalam variabel bash tanpa mengandalkan alat eksternal seperti xxd atau uuencode yang tidak tersedia secara default di platform tempat skrip saya akan dijalankan.

Namun ini adalah solusi yang akhirnya saya kejar karena memecahkan masalah saya yang paling dekat, yaitu membuat skrip yang menyimpan data biner acak sebagai muatan yang dapat ditangani oleh skrip yang memegangnya.

Saya menggunakan artikel ini sebagai sumber saya. Pada dasarnya pendekatan ini menggunakan string pemisah antara skrip dan data biner dan tidak pernah membiarkan bash interpreter mencapai bagian biner di bagian akhir.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.