3

使用Shell脚本制作Linux自解压文件

 7 months ago
source link: https://www.51cto.com/article/781490.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用Shell脚本制作Linux自解压文件

作者:微技术 2024-02-19 16:15:07
前几天在使用阿里云时候发现阿里工程师提供的一个脚本里,后面都是乱码加密文件,并且文件只要一更改自解压就会失效,心里是什么技术进行代码加密,仔细查看代码后发现,原来是 .tar.gz 的二进制文件,把打包压缩以后的文件进行直接存进shell脚本后面,从而实现自解压,次篇文件 使用 tar 编码进行嵌入存文件

前几天在使用阿里云时候发现阿里工程师提供的一个脚本里,后面都是乱码加密文件,并且文件只要一更改自解压就会失效,心里是什么技术进行代码加密,仔细查看代码后发现,原来是 .tar.gz 的二进制文件,把打包压缩以后的文件进行直接存进shell脚本后面,从而实现自解压,次篇文件使用 tar 编码进行嵌入存文件。

c66abaf3234f8115ae38335da8573a9759bdb8.jpg

一、系统环境说明

  • Centos 7 系统
  • shell使用自带bash

二、开始编码测试

1.先来看看阿里工程师编写的部分代码,从代码可以看出后面一连串的乱码是一个 .tar.gz 的打包压缩文件,可以看到是使用 awk 进行获取 .tar.gz 二进制开始行,所以才有那句话 #This line must be the last line of the file 。


#! /bin/bash
#
# Copyright (c) 2009-2015 Aliyun Corporation
# All Rights Reserved
.......
ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"`
tail -n+$ARCHIVE "$0" | tar -ixzvm -C $tmp_dir > /dev/null 2>&1 3>&1
if [ $? -ne 0 ]
then
    echo "Error: prepare env error, failed create extract xbstream..." >&2
    rm -rf $tmp_dir
    exit 1
fi
......
exit 0

#This line must be the last line of the file
__ARCHIVE_BELOW__
^_<8b>^H^@_÷^U^@^CÔ[wX^TW׿à<82><8b>¨Y°!<92>¸<8a>5±ÐD<8c>¯º(Ø+ö<92>^LÃî,<8c>lc^KÅh²v<8c>ÆÞ0FÑ Á^^RM¢Ñ¬]^T<8d>F<

2.编写的测试代码如下


#!/bin/bash
#Test shell self-extracting
TmpDir=/tmp

ARCHIVE=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0")
tail -n+$ARCHIVE "$0" | tar -xzvm -C $TmpDir > /dev/null 2>&1 3>&1
if [ $? == 0 ];then
        echo "Success"
else
        echo "Fail"
fi


exit 0
#This line must be the last line of the file
__ARCHIVE_BELOW__

3.创建一个 test 文件夹,里面建两个文件分别是 TestA 和 TestB ,文件里面分别写着 This is TestA 和 This is TestB

[root@gz--vm-workstation-0001 scripts]# mkdir test
[root@gz--vm-workstation-0001 scripts]# cd test/
[root@gz--vm-workstation-0001 test]# echo "This is TestA" > TestA
[root@gz--vm-workstation-0001 test]# echo "This is TestB" > TestB
[root@gz--vm-workstation-0001 test]# cat TestA 
This is TestA
[root@gz--vm-workstation-0001 test]# cat TestB
This is TestB
[root@gz--vm-workstation-0001 test]#

4.把文件进行打包加压嵌入 shell 脚本(也可以使用cat .tar.gz 文件嵌入 shell 脚本),并且删除 test 文件夹


[root@gz--vm-workstation-0001 scripts]# tar  -zcvm test >> SelfExtracting.sh 
test/
test/TestA
test/TestB
[root@gz--vm-workstation-0001 scripts]# ls
SelfExtracting.sh  test
[root@gz--vm-workstation-0001 scripts]# rm -rf test
[root@gz--vm-workstation-0001 scripts]# ls
SelfExtracting.sh

5.再次查看 SelfExtracting.sh 脚本,发现已经有 .tar.gz 的二进制文件,但注意此时的脚本不能修改和增加任何字符

#!/bin/bash
#Test shell self-extracting
TmpDir=/tmp

ARCHIVE=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0")
tail -n+$ARCHIVE "$0" | tar -xzvm -C $TmpDir > /dev/null 2>&1 3>&1
if [ $? == 0 ];then
        echo "Success"
else
        echo "Fail"
fi


exit 0
#This line must be the last line of the file
__ARCHIVE_BELOW__
^_<8b>^H^@^\<8e>¨Z^@^CíÔM
Â0^P<86>á¬=En`¦ùéÚ<9e>¡^Wp!èªÐÆû;ÍB<8b> â"<95>âû^P<9a>@^B^Yø2ͧ)ïM]Nµ1<96>Y=Ïe-¾<89><8d>¸<94><82><9e>^S^W}kl¬\Wq<9d>òq´Ö<8c>Ã<90>ß<9d>û´¿Qyο×Ï¡Þ^]sÀ)<84>×ùKZä/<9a>¿<84>Ö^[ëê<95>ôðçù÷çËdu<94>'°ûu5XÛ½ÿ»zw|×ÿóÿ_¢nÓÿ+Xö^?Gÿ^C^@^@^@^@^@^@^@^@^@^@°I7^Z<8a>Êá^@(^@^@

6.运行脚本 SelfExtracting.sh 测试

[root@gz--vm-workstation-0001 scripts]# ./SelfExtracting.sh
Success
[root@gz--vm-workstation-0001 scripts]# ls
SelfExtracting.sh

7.聪明的你可能发现,运行显示成功,怎么不见原来的的目录呢,哈哈哈,有没有注意我们是把解压目录指向 /tmp 下面,返回去查看上面脚本定义的变量,所以查看如下

[root@gz--vm-workstation-0001 test]# cd /tmp/test
[root@gz--vm-workstation-0001 test]# ls
TestA  TestB
[root@gz--vm-workstation-0001 test]# cat TestA 
This is TestA
[root@gz--vm-workstation-0001 test]# cat TestB
This is TestB
[root@gz--vm-workstation-0001 test]#

8.在深入研究过程中,看到一篇博客[点击这里查看],发现还有专门的命令可以搞定在脚本嵌入二进制文件: uuencode,安装这个工具请在命令行输入yum install sharutils 进行安装,原理和tar一样,具体操作留给各位去探究了咯。

总结: Shell 自解压脚本在很多情况可以使用,比如防止别人进行修改你的文件,把一些必要的文件发给别人时候,如果使用的是 linux ,可以进行嵌入到shell脚本,就发一个脚本给别人,他们一运行就可以得到他们需要的文件或者配置,如果他们自作聪明打开文件进行修改,哈哈哈哈哈哈哈,对不起,脚本直接报错运行不了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK