bash - باش سيناريو يحتوي على ثنائي قابل للتنفيذ




unix binary (4)

هل من الممكن كتابة برنامج نصي باش، والذي يحتوي على برنامج ثنائي قابل للتنفيذ في الداخل؟

يعني سيناريو، والذي يحتوي على تفريغ من قابل للتنفيذ في شكل نصي، والتي سيتم إلغاؤها مرة أخرى إلى قابل للتنفيذ من قبل هذا البرنامج النصي عند تنفيذه؟

أحب أن أعرف حل، والتي سوف تعمل من خارج منطقة الجزاء دون الحاجة إلى تثبيت حزم إضافية. هل هو ممكن؟

شكر!


بالفعل انه كذلك!

يمكنك على سبيل المثال تفريغ أي ثنائي في ملف مع:

echo $binary > file

هناك العديد من البرامج النصية التثبيت التي تفعل أشياء من هذا القبيل.


حاولت هذا خارج ويعمل. تم إنشاء عرافة مع زسد.

#!/bin/bash

xxd -r >foo <<'EndHere'
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 e003 4000 0000 0000  ..>[email protected]
0000020: 4000 0000 0000 0000 000a 0000 0000 0000  @...............
0000030: 0000 0000 4000 3800 0800 4000 1e00 1b00  [email protected]8.[email protected]
0000040: 0600 0000 0500 0000 4000 0000 0000 0000  [email protected]
0000050: 4000 4000 0000 0000 4000 4000 0000 0000  @[email protected]@[email protected]
...
0001960: 6400 5f65 6461 7461 006d 6169 6e00 5f69  d._edata.main._i
0001970: 6e69 7400                                nit.
EndHere
chmod +x foo
./foo

إذا، إذا حصلت عليه الحق تريد تضمين ثنائي في البرنامج النصي الخاص بك وتنفيذها على خروج البرنامج النصي؟

هنا هو البرنامج النصي binarymaker (هذا ليس فقط إنشاء السيناريو الذي يستخرج ثنائي، ولكن يدمج أي البرنامج النصي الخاص بك مع أي ثنائي):

#!/bin/bash

lineCount=$(wc -l "$1" | cut -f 1 -d ' ') # just get the line count
((lineCount+=2)) # because we are going to append a line

head -n 1 "$1" > "$3" # this is done to ensure that shebang is preserved
echo "trap 'tail -n +$lineCount \$0 > binary; chmod +x binary; ./binary' EXIT" >> "$3"
tail -n +2 "$1" >> "$3"
cat "$2" >> "$3"

exit 0

يجب تشغيله مثل هذا

./binarymaker myscript mybinary resultscript

إذا قمت بتشغيل resultscript ثم كل من myscript و mybinary سيتم تنفيذها. يمكنك اختياريا إضافة أمر إلى rm ثنائي بعد ذلك.

أيضا، لا ننسى للخروج في نهاية السيناريو الخاص بك لأنه خلاف ذلك سوف تستمر ومحاولة تحليل البيانات الثنائية.

إذا كنت تعمل مع برنامج نصي آخر وليس ثنائي، فإنه يمكن تنفيذها من الأنابيب مثل هذا:

tail -n +$lineCount \$0 | source /dev/stdin

لكنها لن تعمل على الثنائيات الحقيقية. أيضا، فإنه لا يعمل إذا كان إصدار باش الخاص بك هو أقل من 4


لا تقم بإعادة اختراع العجلة مثل العديد من الإجابات الأخرى التي تقترح، فقط استخدام الأمر شار الجليل الذي هو بالضبط القيام بذلك عن طريق التصميم.

على افتراض أن الملف الذي تريد تضمينه في البرنامج النصي الخاص بك هو binaryfile ، ببساطة تشغيل

$ shar binaryfile > binaryfile.shar

ويتم تعيين لك. لديك النصي قذيفة المسمى binaryfile.shar الذي عند تنفيذ استخراج binaryfile .





dump