本帖最后由 jjjzw 于 2021-8-3 17:12 编辑
使用了多年macOS后突然意识到,很少有应用程序会在桌面生成图标(像Windows那样),大多都从启动台和程序坞打开。
观察了一下我的桌面,发现有图标的可以是Application中应用程序的替身,也可以是一个app,运行后再运行指向的软件。
正好最近在使用破解版的BurpSuite,每次都需要将sh文件拖入终端运行,比较麻烦,于是想做一个app壳运行sh文件。
app结构
经过观察,最简单的app结构可以表示为:
(app-name).app
└── Contents
└── MacOS
│ └── 脚本
└── Resources
└── Info.plist
其中,脚本可以是unix可执行文件applet:
app1
一眼看出这是脚本编辑器导出的应用程序包,用脚本编辑器打开app:是用AppleScript写的命令:
[AppleScript] 纯文本查看 复制代码 (* Start *)
do shell script "open /Applications/Polyspace/R2020a/bin/matlab"
缺点:对于tell Terminal持续加载的软件,容易导致脚本编辑器无响应
第二种脚本是sh文件,Steam生成的游戏图标都是用这种方式:(PS:Steam生成的桌面图标一半都是损坏的,用本文的方法可以自己制做一个!)
app2
其中,run.sh保存了要运行的命令:
[Bash shell] 纯文本查看 复制代码 #!/bin/bash
# autogenerated file - do not edit
open steam://run/644560
这就是本文的目标!(欢迎大家猜猜644560是什么游戏)
Info.plist是什么
要使用制作出的app,需要一个合格的Info.plist文件
这个文件实现了一些功能如:直接向用户展示信息;系统内部用来标识你的app或其支持的文档类型;系统框架用来辅助app的加载等
Info.plist简单结构
[Plain Text] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>run.sh</string>
······
</dict>
</plist>
其中key是属性,string是值,我们只需要一些必要的值就可以运行。(文后参考资料3)
app生成脚本
掌握了结构,就可以写脚本添加到/usr/local/bin中供调用
touch appmake生成脚本文件
vim打开:
[Bash shell] 纯文本查看 复制代码 #!/usr/bin/env bash
APPNAME=${2:-$(basename "${1}" '.sh')};
DIR=$(dirname "${1}");
CON="${DIR}/${APPNAME}.app/Contents";
MAC="${DIR}/${APPNAME}.app/Contents/MacOS";
RES="${DIR}/${APPNAME}.app/Contents/Resources";
INF="${CON}/Info.plist";
if [ -a "${APPNAME}.app" ]; then
echo "${PWD}/${APPNAME}.app already exists. Provide some unique name if you want to create it anyway. ";
exit 1;
fi;
mkdir -p "${MAC}";
mkdir -p "${RES}"
cp "${1}" "${MAC}/run.sh";
chmod +x "${MAC}/run.sh";
cat>>"${INF}"<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>run.sh</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>1.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
</dict>
</plist>
EOF
echo "CREATE ${DIR}/${APPNAME}.app SUCCESSFULLY";
保存到appmake文件
将appmake文件复制到/usr/local/bin
终端输入:
[Bash shell] 纯文本查看 复制代码 sudo chmod +x /usr/local/bin/appmake
调用:
调用方式:终端输入:
appmake parameter1 parameter2
parameter1为sh文件全路径,parameter2为app名字(缺省为sh文件名)
输出app到sh文件目录下
示例
BurpSuite.sh:
[Bash shell] 纯文本查看 复制代码 #!/bin/bash
/Applications/Burp\ Suite\ Professional.app/Contents/PlugIns/jre.bundle/Contents/Home/bin/java -Dfile.encoding=utf-8 -noverify -javaagent:/Applications/Burp\ Suite\ Professional.app/Contents/java/app/burp-loader-x-Ai.jar -Xmx2048m -jar /Applications/Burp\ Suite\ Professional.app/Contents/java/app/burpsuite_pro.jar
终端:
[Bash shell] 纯文本查看 复制代码 appmake /Users/apple/Desktop/BurpSuite.sh BurpSuite
输出:
[Bash shell] 纯文本查看 复制代码 CREATE /Users/apple/Desktop/BurpSuite.app SUCCESSFULLY!
app
双击可以运行!
(app图标可以自行设置)
意外收获:原先需要终端持续加载的软件,生成app后居然可以直接打开,目前还不明白原理,欢迎大家测试!
总结
因为没有接触过Xcode、Shell和AppleScript开发,这次探索学到了相当多的知识,脚本完成后再看macOS应用程序的结构,有恍然大悟之感
|