将多个文件打包成一个shell

1. 脚本目的

    实现自动化环境部署,且将软件包和部署脚本合并成一个文件,避免脚本和文件分开。

2. 实验环境

    (1) Linux环境

        centos 7.4

    (2) 软件包

        [root@centos-70 0517]# tar -tf apache_2.4.29.tar.gz # 以自动化安装apache为例

        apr-1.6.3.tar.gz

        apr-util-1.6.1.tar.gz

        httpd-2.4.29.tar.gz

    (3) 安装脚本

        [root@centos-70 0517]# ll install.sh  # 该脚本实现对apache_2.4.29.tar.gz解压和httpd环境部署

        -rw-r--r-- 1 root root 2958 May 17 12:03 install.sh

    (4) 打包脚本

        [root@centos-70 0517]# cat package.sh # apache_2.4.29.tar.gzinstall.sh合并成一个文件

        #!/bin/bash

        SCRIPT_SIZE=$(stat -c %s $2)

        PACK_SIZE=$(stat -c %s $3)

        echo '#!/bin/bash'>/tmp/compress.sh

        echo "dd if=$1 of=$3 bs=1 count=$PACK_SIZE  skip=$[SCRIPT_SIZE+100]" >> /tmp/compress.sh

        COM_SIZE=$(stat -c %s /tmp/compress.sh)

        if [ $COM_SIZE -ne 100 ];then

            sed -i "2d" /tmp/compress.sh

            echo "dd if=$1 of=$3 bs=1 count=$PACK_SIZE  skip=$[SCRIPT_SIZE+COM_SIZE]" >> /tmp/compress.sh

            COM_SIZE_NEW=$(stat -c %s /tmp/compress.sh)

            if [ $COM_SIZE -lt $COM_SIZE_NEW ];then

               sed -i "2d" /tmp/compress.sh

               echo "dd if=$1 of=$3 bs=1 count=$PACK_SIZE  skip=$[SCRIPT_SIZE+COM_SIZE-1]" >> /tmp/compress.sh

            elif [ $COM_SIZE -gt $COM_SIZE_NEW ];then

               sed -i "2d" /tmp/compress.sh

               echo "dd if=$1 of=$3 bs=1 count=$PACK_SIZE  skip=$[SCRIPT_SIZE+COM_SIZE+1]" >> /tmp/compress.sh

            fi

            COM_SIZE=$(stat -c %s /tmp/compress.sh)

        fi

        dd if=/tmp/compress.sh of=$1 count=$COM_SIZE bs=1 >/dev/null

        dd if=$2 of=$1 count=$SCRIPT_SIZE bs=1 seek=$COM_SIZE >/dev/null

        dd if=$3 of=$1 count=$PACK_SIZE bs=1 seek=$[COM_SIZE+SCRIPT_SIZE] >/dev/null 

3. 测试

    (1) 合并apache_2.4.29.tar.gzinstall.sh

        [root@centos-70 0517]# ll

        total 10020

        -rw-r--r-- 1 root root 10251674 May 17 11:11 apache_2.4.29.tar.gz

        -rw-r--r-- 1 root root     2958 May 17 12:03 install.sh

        -rw-r--r-- 1 root root     1070 May 17 12:45 package.sh

        [root@centos-70 0517]# bash package.sh apache_2.4.29.tar.sh install.sh apache_2.4.29.tar.gz  # 注意参数顺序

        [root@centos-70 0517]# ll

        total 20036

        -rw-r--r-- 1 root root 10251674 May 17 11:11 apache_2.4.29.tar.gz

        -rw-r--r-- 1 root root 10254726 May 18 00:39 apache_2.4.29.tar.sh

        -rw-r--r-- 1 root root     2958 May 17 12:03 install.sh

        -rw-r--r-- 1 root root     1070 May 17 12:45 package.sh

    (2) 查看apache_2.4.29.tar.sh内容(建议使用vim或者下载到win上用sublime text等文本编辑器查看)

        该文件有三部分组成:

        (a) 解压部分

            #!/bin/bash

            dd if=apache_2.4.29.tar.sh of=apache_2.4.29.tar.gz bs=1 count=10251674  skip=3052

        (b) install.sh部分

        (c) 乱码部分(该部分为apache_2.4.29.tar.gz)

    (3) 在服务器上执行apache_2.4.29.tar.sh

        [root@centos-71 ~]# bash apache_2.4.29.tar.sh

        [root@centos-71 ~]# /usr/local/apache/bin/apachectl start

        [root@centos-71 ~]# curl 127.0.0.1

        <html><body><h1>It works!</h1></body></html>

4. 补充

    (1) 重点是package.sh脚本,install.sh apache_2.4.29.tar.gz可以根据随意调整。

    (2) 打包完成后的apache_2.4.29.tar.sh 不能随意修改,改动任意字符都可能会导致脚本出错。

猜你喜欢

转载自blog.51cto.com/11879548/2127843