Скоріш за все вам навіть це не спадало на думку, проте так, насправді, є можливість скомпілювати bash-скрипт у бінарний вигляд. Щоправда це не зовсім так, адже програма, мова про яку піде далі, спочатку транслює bash-скрипт в Cі-скрипт, а вже потім його компілює. Як наслідок, ніхто і ніколи не побачить того, що було "накостилячено" в скрипті. Проте таким чином також можна заборонити редагування коду чи приховати паролі, котрі вживаються в скрипті і мають бути недоступні всім іншим.
Ім'я цієї програми Shc і, на щастя, вона відсутня в репозиторіях. Тому зкомпілюємо її :
# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
--2013-11-12 01:40:16-- http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
Resolving www.datsi.fi.upm.es (www.datsi.fi.upm.es)... 138.100.9.22
Connecting to www.datsi.fi.upm.es (www.datsi.fi.upm.es)|138.100.9.22|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20536 (20K) [application/x-gzip]
Saving to: ‘shc-3.8.9.tgz’
100%[====================================================>] 20 536 --.-K/s in 0,1s
2013-11-12 01:40:16 (150 KB/s) - ‘shc-3.8.9.tgz’ saved [20536/20536]
# tar xvfz shc-3.8.9.tgz
shc-3.8.9/CHANGES
shc-3.8.9/Copying
shc-3.8.9/match
shc-3.8.9/pru.sh
shc-3.8.9/shc-3.8.9.c
shc-3.8.9/shc.1
shc-3.8.9/shc.README
shc-3.8.9/shc.html
shc-3.8.9/test.bash
shc-3.8.9/test.csh
shc-3.8.9/test.ksh
shc-3.8.9/makefile
В останній версії є маленькі проблеми з назвами:
# cp shc-3.8.9.c shc.c
Збираємо програму:
# make
cc -Wall shc.c -o shc
*** Do you want to probe shc with a test script?
*** Please try... make test
І за бажанням можна скопіювати скрипти в системні директорії:
# make install
*** Installing shc and shc.1 on /usr/local
*** Do you want to continue? y
install -c -s shc /usr/local/bin/
install -c -m 644 shc.1 /usr/local/man/man1/
Тепер найцікавіше. Продемонструю роботу програми на звичайному простому срипту, що має вигляд:
# vim myscript.sh
#!/bin/bash
echo "Enter your name: "
read Name
echo "Your name is $Name"
Нічого хитрого. Зберігаємо скрипт і запускаємо наступне:
$ shc -v -r -T -f myscript.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc myscript.sh.x.c -o myscript.sh.x
shc: strip myscript.sh.x
shc: chmod go-r myscript.sh.x
Значення ключів можна почитати в мануалі, там все просто. На виході отримуємо:
myscript.sh.x - транслюваний скрипт в Сі код.
myscript.sh.x.c - зкомпільований бінарник.
$ file myscript.sh.x
myscript.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xdac86a0ceb75a17e74f4c66d64d4278791b305d7, stripped
$ file myscript.sh.x.c
myscript.sh.x.c: C source, ASCII text
Запускаємо скомпільований скрипт:
$ ./myscript.sh.x.c
Enter your name:
Ipeacocks
Your name is Ipeacocks
Ніби все. Проте додам, що варто не зловживати такими речами, адже shell-скрипт має залишатися shell-скриптом. Ось декілька посилань, що, можливо, будуть корисними:
Немає коментарів:
Дописати коментар