利用shell脚本制作可执行安装程序
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是 个压缩包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin、run等安装脚本的简单制作了。
如在linux 下制作二进制 .bin 文件的制做方法:就是使用cat 命令将执行脚本和打包文件同时放到一个.bin的文件里。这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
下例就是一名为install.sh脚本,它实现以下功能:
● 自动创建用户及用户组
● 自动检查网络环境并安装环境包所需要的支撑环境
● 显示安装进度
● 自动检查并配置防火墙
● 自动安装环境包
● 自动增加自启动脚本
1. bin文件制作步骤
a) 打包文件
tar cvf myapp-env-1. myapp-env-1.0-linux-x64-installer.tar
b) 编写脚本
内容见《install.sh脚本内容》节
c) 可执行安装程序制作方法
# cat install.sh myapp-env-1. > myapp-env-1.0-linux-x64-installer.bin
这样就生成myapp-env-1.0-linux-x64-installer.bin的安装文件,该文件是由shell脚本和
二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等 二进制查看命令可以看到。
2. 安装
chmod 755 myapp-env-1.0-linux-x64-installer.bin
./ myapp-env-1.0-linux-x64-installer.bin
3. install.sh脚本内容
#/bin/bash
shell程序的编写流程PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
curdir=`pwd`
installdir=/myapp
myappuser=myapp
env_name=myapp-env-1.0-linux-x64-installer
sum=0
echo "----------------------------------------------------------------------------"
echo "Welcome to the myapp-env-1.0 for linux-x64 Stack Setup Wizard."
echo "----------------------------------------------------------------------------"
echo " "
echo "Installation folder : $installdir "
echo "----------------------------------------------------------------------------"
echo ""
echo " "
#检查网络环境
checknetwork ()
{
netstat=$(ping -c3 www.baidu|grep transmitted |awk '{print $4}')
}
#检查网络状态、判断支撑软件是否安装,若没有安装则自动安装。
checkenv ()
{
rpm -qa > /
for soft in $softlist
do
grep "^$soft" / > /dev/null
if [ $? -ne 0 ] ; then
echo "$soft is not installed"
if((netstat==0)) ; then
echo "ping -c3 www.baidu ,failed . Please check network"
exit
else
echo "install $soft ...... "
yum -y install $soft | tee -a install.log
fi
else
echo "$soft was installed"
fi
\rm /
done
}
#检查防火墙配置,并自动配置防火墙策略
Config_Firewall ()
{
echo "checking and configuring the firewall rule ....."
echo " "
for port in $myappport
do
iptables -L -n |grep :$port
if [ $? -ne 0 ] ; then
if [ "$port" == "8080" ] ; then
/sbin/iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT
else
/sbin/iptables -I INPUT -p tcp --dport $port -j ACCEPT
fi
echo "$port is not in iptables, the Port: $port is opened"
else
echo "$port is exists"
fi
done
}
#增加用户、密码和用户组、并修改安装目录的属主
adduser()
{
echo "----------------------------------------------------------------------------"
echo " creating UserGroup: $myappuser and username: $myappuser and default passwd: myapp4308 "
#若用户已经存在则不增加
grep "$myappuser:" /etc/group &> /dev/null || groupadd $myappuser
grep "$myappuser:" /etc/passwd &> /dev/null || useradd $myappuser -d $installdir -g $myappuser
#用户密码
echo "myapp4308" | passwd --stdin "$myappuser"
#修改目录属主
chown $myappuser $installdir
chgrp $myappuser $installdir
}
#支撑软件列表
softlist="
gcc
openssl
unixODBC
unixODBC-devel
ncurses-devel
gtk2
xmlto
dialog
"
#应用端口列表
#mysqlport=3306
#wwwport=8080
#mqport=5673
#mqweb=5567
myappport="
8080
5567
5673
3306
"
checknetwork
checkenv $softlist
echo "----------------------------------------------------------------------------"
Config_Firewall $myappport
iptables-save > /etc/sysconfig/iptables
echo "----------------------------------------------------------------------------"
if [ ! -d "$installdir" ] ; then
echo " creating folder $installdir"
mkdir $installdir
else
echo "Warning: cannot create directory $installdir exists. "
echo "----------------------------------------------------------------------------"
exit
fi
adduser
echo "----------------------------------------------------------------------------"
echo "Extract the "
echo "----------------------------------------------------------------------------"
#将二进制文件从.bin文件里分离出来
sed -n -e '1,/^exit 0$/!p' $0 > "${installdir}/$env_" 2>/dev/null
if [ $? -eq 0 ];then
echo "Install ......"
cd $installdir
# su $myappuser -c "gunzip < $env_ | tar xvvf -"
# for x in "`tar -tvvzf $env_`"; do
# one=`echo "$x" | awk '{print $3}'`;
# done
# for x in $one; do
# sum=`expr $sum + $x`;
# done
# s=$sum
s=650028382
#以myappuser用户执行解压并显示进度
su $myappuser -c "gunzip < $env_ | tar xvvf -" | awk -v s=$s '{ a=a+$3; b=(a/s)*100;printf "%d\n",b}' | dialog --gauge "Install ..." 10 70 0
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论