需求及應(yīng)用場(chǎng)景
1、簡(jiǎn)化操作。一般的軟件安裝過程,如果想要精簡(jiǎn)步驟,我們一般會(huì)將需要在命令行中輸入的命令寫成一個(gè)腳本,同時(shí)將安裝介質(zhì)準(zhǔn)備好。我們將腳本和安裝介質(zhì)上傳到生產(chǎn)環(huán)境,然后通過執(zhí)行腳本來(lái)完成安裝。如果能夠?qū)⑦@兩個(gè)文件合并為一個(gè)可執(zhí)行文件,那安裝的過程就更簡(jiǎn)單明了。
2、代碼保護(hù)。對(duì)于一段腳本,提供給用戶使用,但是不希望用戶看到腳本的內(nèi)容,可以通過將腳本發(fā)布為.bin的形式。這樣用戶在環(huán)境中可以執(zhí)行、安裝,但是無(wú)法看到里面的內(nèi)容,也無(wú)法修改,從而達(dá)到保護(hù)腳本內(nèi)容的目的。
實(shí)現(xiàn)方法
1、本文以在Redhat系統(tǒng)中安裝ftp命令為例說明,如何將安裝腳本和安裝介質(zhì)整合成一個(gè)文件,簡(jiǎn)化操作。
首先,編寫一個(gè)腳本,包含安裝的命令。
#!/bin/sh
echo "Hello World"
dir_installation=/root/create_bin
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_installation}/ftp-0.17-54.el6.x86_64.rpm" 2>/dev/null
cd $dir_installation
rpm -ivh ftp-0.17-54.el6.x86_64.rpm
rm ftp-0.17-54.el6.x86_64.rpm
exit 0
注意,這個(gè)腳本的關(guān)鍵在于sed,他會(huì)把exit 0后面的內(nèi)容提取出來(lái),另存為rpm包,然后執(zhí)行安裝,安裝完成后刪掉rpm。
最后,我們用cat命令將腳本和安裝包生成一個(gè)新的文件。
這時(shí),如果用file命令查看install-rpm.bin文件,可以發(fā)現(xiàn)它的類型還是文本類型,用vim編輯器打開,還是可以看到腳本內(nèi)容的,也可進(jìn)行修改。
2、對(duì)于第二個(gè)隱藏代碼內(nèi)容的需求,有一款工具叫做 shc ,可以用它來(lái)將腳本編程二進(jìn)制文件。
shc的用法比較簡(jiǎn)單,下載后make生成可執(zhí)行文件,然后直接對(duì)腳本進(jìn)行加密,會(huì)生成兩個(gè)文件。一個(gè)以.x結(jié)尾,為可執(zhí)行的二進(jìn)制文件。另一個(gè)以.x.c結(jié)尾,為生成的中間c文件。shc還能指定可執(zhí)行腳本的過期時(shí)間。
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
tar xvfz shc-3.8.9b.tgz
cd shc-3.8.9b
make
./shc -v
shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script
./shc -f install-rpm.bin
通過 shc 可以將腳本文件編譯成二進(jìn)制文件,隱藏了腳本的內(nèi)容,對(duì)于一般的用戶是沒辦法查看和修改的。當(dāng)然,還是有辦法可以再將二進(jìn)制文件轉(zhuǎn)換為純文本的腳本的。