这个方法的灵感来自于 alipay 的安全控件安装,所以先感谢 alipay。

下面是经过我自己修改的自解压 shell 代码(嵌入式板子上是busybox提供的sh)

#!/bin/sh
#
# Thanks to Alipay Corporation
#
# Author: Zhenxing Luo
# Date: 2015/12/03
# Support: If you have any question, please feel free to call me
# MOB:15257413812
# rmOld()
{
rm -rf /opt/Qtopia/apps/*
rm -rf /usr/local/Trolltech/QtEmbedded-4.8.5-arm/lib/fonts/* echo "Ready! Begin updating..."
return 0
} checkVersion()
{
board=`uname -r` if [ $board != "3.6.0-FriendlyARM" ]
then
echo "This file is for Mini2451-1307 only!"
exit 1
fi
return 0
} main()
{
checkVersion rmOld ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"`
tail -n+$ARCHIVE "$0" | tar xzvm -C /> /dev/null 2>&1 3>&1
if [ $? -ne 0 ]
then
echo "Failed! Don't do any edit to this file!"
exit 1
fi
echo "Done! Have a nice day :)"
exit 0
} main #This line must be the last line of the file
__ARCHIVE_BELOW__ --- the tar.gz here ---

其中,main()里面做了自解压的事,主要步骤是:

1. 用 awk 在本文件中( $0 是程序的第一个参数,即自己的文件名 )里查找 “__ARCHIVE_BELOW__” 这一句, 返回行号。

2. 使用 tail 截取本文件从"行号 +1" 之后的内容,并将其通过管道传给 tar,由 tar 负责解压。

另外,因为这个自解压程序是用 shell 写的,所以,在解压之前,还可以做一些其他的事,比如,我上面的检查系统版本和删除旧文件。所以,这种方法是拿来做升级包和安装包的不二之选。

至于用法,需要的人应该一眼就能看出该怎么用 :)

====================================================

接上面,二机制文件在拷贝和传输过程中,还是有可能被损坏的;或者杀毒软件会被奇怪的二进制代码认定为某种威胁。

然后,就有了先对二进制文件进行编码的想法,用 base64 编码将二机制文件转化为文本文件再传输。

下面是这个思路的一种实现。

#!/usr/bin/env bash

function mkpackage(){
target_dir=$
felow_install_shell_command_file=$ tar -zcf ._test_dir.tar.gz $target_dir
echo "tar is done!" base64 ._test_dir.tar.gz >._base64
rm ._test_dir.tar.gz
echo "base64 coding is done!" echo "#!/usr/bin/env bash" >install.sh
echo "" >>install.sh echo "test_base64=\\" >>install.sh
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line\\" >>install.sh
done <./._base64
rm ._base64 echo "" >>install.sh
echo "" >>install.sh echo 'printf $test_base64|base64 -d >._temp.tar.gz;'>>install.sh
echo 'tar zxf ._temp.tar.gz' >> install.sh
echo 'rm ._temp.tar.gz' >>install.sh echo "install.sh is ready!" if [[ -e $fellow_install_shell_command_file ]]; then
cat $fellow_install_shell_command_file >>install.sh
fi chmod +x install.sh
}
function usage(){
echo "usage:"
echo " $1 test_dir [the_command.sh]"
} if [[ $# != ]]
then
mkpackage $ $
else
usage $
fi

该方法来自于(好像是编辑器问题,博主给的代码有问题,上面贴的是我修正的代码):http://www.jianshu.com/p/0cc02fa6eb87

Linux 下自解压文件的制作的更多相关文章

  1. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

  2. Linux下的文件及文件后缀名

    Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...

  3. Linux 下查看文件字符编码和转换编码

    Linux 下查看文件字符编码和转换编码 如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linu ...

  4. linux下.run文件的安装与卸载

    linux下.run文件的安装与卸载   .run文件的安装很简单,只需要为该文件增加可执行属性,即可执行安装 以 virtualbox 的安装文件 virtualbox-3.1.6-59338-Li ...

  5. linux下查看文件及目录个数

    linux下查看文件及目录个数1.查看当前文件和目录总数(不包括子目录):ls -l | wc -l 2.查看当前目录下文件个数(不包括子目录):ls -l |grep "^-"| ...

  6. Linux下vim文件未正常退出,修复文件

    Linux下vim文件未正常退出,会产生一个 .文件名.swp的文件 ls -al  ,rm   删掉.swp文件 之后就可以正常使用文件了

  7. (转)Linux下查看文件和文件夹大小 删除日志

    场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...

  8. linux下各文件夹的结构说明及用途介绍

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令.   /dev:设备特殊文件.   /etc:系统管理和配置文件.   /etc/rc.d:启动的配 置文件和脚本.   /ho ...

  9. Linux Linux下最大文件描述符设置

    Linux下最大文件描述符设置 by:授客 QQ:1033553122 1.   系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...

随机推荐

  1. Linux 进程详解

    Linux内核的七大区间 .进程管理(进程创建,进程的三种状态,进程间的调度,调度算法...) .内存管理(段式管理(Linux所有段都从0开始),页式管理--地址偏移量) .系统调用(C语言库函数的 ...

  2. UDP的坏处

    众所周知,UDP是一个面向无连接的协议.通信时不可靠的.这就会出现一些问题 (1)数据报丢失 因为是无连接,的所以可以用recvfrom和sendto来接收和发送消息,如果socket是阻塞的,那么当 ...

  3. Hadoop: MapReduce2多个job串行处理

    复杂的MapReduce处理中,往往需要将复杂的处理过程,分解成多个简单的Job来执行,第1个Job的输出做为第2个Job的输入,相互之间有一定依赖关系.以上一篇中的求平均数为例,可以分解成三个步骤: ...

  4. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  5. 利用windbg查找dictionary导致IIS占CPU100%案例分析(一)

    一.背景 先说下windbg使用场景.各位coder在工作中或多或少都会遇到下面四种情况 1.本地代码好好的,放服务器上运行一段时间后,IIS服务突然占用 w3wp.exe CPU突然100% ,不得 ...

  6. Spring MVC 急速集成 Shiro 实录

    相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...

  7. JavaScript Array

    1.常用方法 // 数组构造 var a = new Array(20); // 长度为20的数组 var b = new Array('red', 'blue', 'white'); var c = ...

  8. 两个Canvas小游戏

    或许连小游戏都算不上,可以叫做mini游戏. 没有任何框架或者稍微有点深度的东西,所以有js基础的或者要追求炫酷效果的可以直接ctrl+w了. 先贴出两个游戏的试玩地址: 是男人就走30步 是男人就忍 ...

  9. 从语言到库到框架,再到API,再到标记最后到DSL语言

    计算机技术发展很快,而且越来越快,结果也是越来越复杂,那么我们到底怎么搞定复杂性并重用代码? 很明显,这是个大难题.一开始我们要解决计算问题,发展了基本的编程语言. 很快,编程语言不能满足需求,我们需 ...

  10. Android开发自学笔记(Android Studio1.3.1)—3.Android应用结构解析

    一.R文件是什么?      如上图所示,我们可以通过findViewById方法通过传入R.id.show找到我们的TextView元素,findViewById方法也很好理解,从View中通过Id ...