Makeself.sh是一个小的Shell脚本,用于从一个目录中生成自解压的tar.gz压缩包。结果文件以一个shell脚本显示(大多数以.run作为后缀名),可以自动运行。该文档会解压自己到一个临时目录,并且执行一个可选的任意命令(例如:一个安装脚本)。它非常类似于Windows中的Winzip自解压生成的文件。Makeself文档也包括校验和用于集成子验证(CRC或MD5校验和)。
Makeself.sh脚本自身只用于从文件目录中创建一个的文档。生成的文档实际上是一个压缩(使用gzip,bzip2或压缩)TAR文件,在文件的开始加入一小段Shell脚本。这是一个小的Stub脚本,用于执行解压文件,运行嵌入命令和删除临时文件。为了安装包含在该文档中的软件,用户只需要运行“文档”,例如:sh nice-software.rum。我推荐这些文件使用“run”或“sh”作为后缀,不要迷惑用户,因为他们知道它实际上是一个Shell脚本,它后面带有相当多的二进制数据。
从2.1开始,makeself已经重写过,在下面的平台上进行测试:
1. Linux(所有发行版)
2. Sun Solaris(8以上版本)
3. HP-UX(HPPA RISC上的11.0和11i)
4. SCO OpenUnix和OpenServer
5. IBM AIX 5.1L
6 MacOS X(Dario)
7. SG IRIX 6.5
8. FreeBSD
9. UnicOS/Cray
10.Cygwin(Windows)
主页(当前最新版本2.2.0):
https://github.com/megastep/makeself
http://megastep.org/makeself/
源代码下载:
https://github.com/megastep/makeself/archive/release-2.2.0.tar.gz
官方最新发行版下载:
http://cdn.megastep.org/makeself/makeself-2.2.0.run
为了在Linux上安装makeself,下载最新版本的存档格式文件,执行下载的文件,当文件自解压以后会在当前目录下创建一个新的目录称为makeself-2.2.0,拷贝所有的shell脚本到/usr/bin目录下完成安装。
$ wgethttp://megastep.org/makeself/makeself-2.2.0.run
$ chmod 755 makeself-2.2.0.run
$ ./makeself-2.2.2.run
$ cd makeself-2.2.0
$ sudo cp *.sh /usr/bin
makeself.sh的基本使用方法如下:
makeself.sh [args] archive_dir file_namelabel startup_script [script_args]
“label”参数是SFX解压缩时打印的消息,“start_script”指定在SFX归档文件成功解压缩后执行的脚本和命令。当你想创建一个自解压的安装文件时会有用处。通常启动脚本将拷贝和安装解压的内容到合适的目标目录中。启动脚本必须位于打包的目录中,因此脚本包含在SFX归档文件中。
1. args是Makeself的可选参数,可用的有:
--vesion:打印版本信息到控制台,然后立即退出;
- --gzip: 使用GZIP压缩(缺省选项)
- --bzip2:使用bzip2压缩
- --compress:使用Unix的compress命令压缩数据
- --nocomp:不压缩
- --notemp:不解压文件到一个临时目录,但是在当前目录下创建一个新的子目录。
- --current:文件将解压到当前目录,而不是子目录中,隐含--notemp选项
- --follow:跟随所有的符号链接,也打包那些符号链接的文件。
- --append:最近数据到现有的文档中,而不是创建一个新的数据。
- --header:Makeself2.0开始可以使用一个单独文件存储头部stub,称为makeelf-header.sh,假设位于makeself相同的位置。
- --copy:….
2. archive_dir:包含归档文件的目录名称
3. file_name:创建归档文件的名称
4. label:描述软件包的任意文本字符串,当解压文件时显示
5. startup_script:在提取文件目录中的命令,因此如果你希望执行一个
在该目录中的程序,你必须在你的命令之前加上前缀“./”,例如:./program是正确的,script_args是改命令的附加参数。
这里有一个示例,假设用户有一个包镜像存储在/home/joe/mysoft目录中,它希望生成一个自解压的mysoft.sh软件包,它将启动存储在/home/joe/mysoft目录下的setup脚本,执行命令如下:
makeself.sh/home/joe/mysoft mysoft.sh "Joe's Nice Software Package" ./setup
下面是创建包含Makeself发行版的makeself.run文档的命令:
makeself.sh --notempmakeself makeself.run "Makeself by Stephane Peter" echo"Makeself has extracted itself"
由makeself生成的文档可以传递下面的参数:
- --keep:放置文件解压到一个临时目录中(在嵌入脚本执行之后会被删除掉)。文件将直接解压到当前的工作目录中,直到你删除它。
- --verbose:在执行嵌入式命令之前提示用户
- --target:允许解压目录到任意位置
- --confirm:运行嵌入式命令之前提示用户确认
- --info:打印出关于文档的通用信息(不解压)
- --lsm:打印LSM条目
- --check:使用嵌入的校验和检查文档,不解压文档
- --nochown:缺省,在解压之后在目标目录下运行“chown -R”命令,以便所有文件属于当前用户。如果你以root用户运行大部分需要这样,tar将尝试重新创建初始化用户所有者。你可以禁用这个行为。
- --tar:对文档的内容运行tar命令,使用后面的参数作为命令的参数。
- --noexec:解压后不运行嵌入式脚本
任何文档后面的参数将作为附加参数传递给嵌入的命令。在任何这些选项之前,你应该显示的使用--专用命令行结构,确保Makeself不会尝试解释它们。
为了创建一个自解压的文档,包含所有文件在backup目录下,做下面操作。启动函数只是打印“Extraction done”不做更多的事情。
$ makeself.sh --notemp./backup ./backup.run "SFX archive for backup" echo "Extractiondone"
Header is 403 lines long
About to compress 1540 KB of data...
Adding files to archive named"./backup.run"...
./
./jpeg/
./jpeg/1.jpg
.
.
CRC: 2238411397
MD5: 0b0fd3a2ba08ffcec821b9cbaa11b70d
Self-extractible archive"./backup.run" successfully created.
为了解压文档中的文件,简单的执行文档:
$ ./backup.run
Creating directory backup
Verifying archive integrity... All good.
Uncompressing SFX archive forbackup.............
Done
如果你希望创建一个自解压安装文件,你需要准备一个单独的启动脚本,它将在解压完成后执行安装过程。
1.创建一个临时目录
#mkdir sftpupload
2.把sftpupload-20141118.zip文件拷贝到该目录中
#cp <dir>/sftpupload-20141118.zip sftpupload
3.然后在sftpupload目录下创建一个Shell安装脚本,名为install.sh:
# vi sftpupload/install.sh
#!/bin/bash
echo "Upload start ..."
CURRENT_DIR=`pwd`
echo "1. Current directory$CURRENT_DIR"
INSTALL_DIR=/data/natspace/nat/script/pyscript/sftpupload
TEMP_DIR=$CURRENT_DIR/sftpupload
ZIP_FILE=sftpupload-20141118.zip
echo "2. Unzip file: $ZIP_FILE to$TEMP_DIR"
rm -rf $TEMP_DIR
unzip $ZIP_FILE -d $TEMP_DIR
cd $TEMP_DIR
echo "3. Check the directory:$INSTALL_DIR"
if [ ! -d $INSTALL_DIR ]; then
mkdir -p $INSTALL_DIR
fi
echo "4. Remove stop-*.shscript!"
rm -rf $INSTALL_DIR/stop-*
echo "5. Move file to$INSTALL_DIR"
mv -f * $INSTALL_DIR
chmod 755 $INSTALL_DIR/*.sh
echo "6. Delete the directory:$CURRENT_DIR"
cd $INSTALL_DIR
rm -rf $CURRENT_DIR # TODO:makeself脚本执行完毕后会自行删除该目录
echo "7. Execute stop-all.shscript"
./stop-all.sh
echo "Update done!"
然后让启动脚本拥有可执行:
$ chmod 755 sftpupload/install.sh
继续,创建一个自解压安装文件,打包启动脚本,如下:
$ makeself.sh sftpupload sftpupload.run"Update sftpupload program" ./install.sh
注意::install.sh(安装脚本)之前必须带有“./”前缀,并且install.sh脚本必须具有可执行权限。
注意:install.sh(安装脚本)必须放在makeself的打包目录中。