技术解析

bash file.sh 解压
0
2021-06-16 11:02:27
idczone
有几个文件,一个二进制文件,一个纯文本文件,三个 shell 脚本,分别是 run.sh stop.sh clean.sh

需求,把这几个文件压缩为一个包,
名字是 help.sh

客户拿到文件后
bash help.sh 即可当前目录解压
而后当前目录运行 bash run.sh 即可运行。

用什么方案能做这个 help.sh 压缩包呢?

我之前用的是 tgz 。
对方先 tar zxvf help.sh
而后 cd help
最后运行 bash run.sh
但是,还是有人会搞错的。
虽然说后缀不影响使用,但这 help.sh 名字也真是怪。别人为什么会出错?是一点 linux 基础都没有的那种吗?

唔,奇怪的问题...不过也可以试着这样做。
zip -r help.sh ./* && echo '\n unzip help.sh' >> help.sh
需要客户系统中预装 unzip,也可以写在 help.sh 中给客户装一下。

直接 Bazel 打包成一个.sar 可执行文件 用户也不用管解压啥的 直接运行
https://docs.bazel.build/versions/3.4.0/be/shell.html#sh_binary

Self-extracting Shell Script
https://sysplay.in/blog/linux/2019/12/self-extracting-shell-script/

不明白脚本为啥要压缩?很大吗?

直接把指定行后的内容喂给 gzip 就行了

进来解压的,告辞

还以为能解压呢,进来发现是真解压。。。
告辞

二进制直接打到 shell 里面,有的安装包就是这样做的

你把解压缩代码写在 sh 里啊,然后从脚本尾部把压缩包提取出来解压不就好了。

多谢各位指点。
我原来写
tar zxvf xxx.tgz
发现用户那边容易搞错。
你很难想象,对方会大小写不分,随意加空格或者不打空格。
所以,寻求更为简单的策略。
尽量让对方,bash 一下就搞定了。
再次感谢诸位指点。

多谢。

一个脚本一个 function 不就行了吗

makeself.sh

文档这么写:
tar 空格 zxvfk 空格 xxx.tgz 请注意英文字母为全小写,不要开启中文输入法!

对方是真心不会还是故意刁难你啊

二进制是 executable 吗,如果是,直接在生成这个 executable 的时候包含文本信息,stop, run, clean 就可以以参数的形式来执行。比如 nginx 就是启动 nginx, nginx -s stop 就是停止 nginx

更直接的方式是直接让用户选,假设 executable 叫 dosth, 用户直接输入 dosth, 然后提示 "您想干嘛呢"
1. 运行 dosth
2. 终止运行 dosth
3. Clean
当然如果 dosth 已经在运行要提示用户,而且不提供 1 选项; 没有运行不提供 2 选项

```
echo 'bash'"\necho \"$(tar -cf - binfile testfile run.sh start.sh stop.sh | base64 )\" | base64 -d | tar -xf -" > help.sh; chmod +x help.sh
```
这样生成的 help.sh 就是你要的了。

我曾经写了一个 CentOS 的配置脚本,最后一部分是:
disable GUI
echo -e "Enable GUI or no GUI? y/n"
echo -e "Please input y or n"
read check
if [ ${check} = n ]
then
echo "Disable GUI"
systemctl set-default multi-user.target
elif [ ${check} = y ]
then
echo "enable GUI"
systemctl set-default graphical.target
fi
用户看到的信息是:
Enable GUI or no GUI? y/n
Please input y or n
然后,对方拍屏幕照片给我,大哥,下一步怎么弄?
你让我怎么回复?

补充一下:
我碰到的情形是,
对方基本上使用 Linux 服务器做计算模拟,基本是英文 4 级、6 级分数还不错的在读硕士、博士研究生。
需要我协助他们部署好 Linux 系统平台和专业软件。
他们只负责用专业软件做专业事情,并不晓得什么 Linux 基础之类的事情。

tail -c 1234567 "/path/to/script.sh" > /tmp/your/temp.tar.gz 2> /dev/null
gnuzip -xzf /tmp/your/temp.tar.gz
打包的时候把 tar.gz 输出到 script.sh 后面.
需求很常见, atlassian 的安装包都是这样的.

。。。直接把 binary file 存在 sh 里就是业内最标准的做法了。。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服