Shell脚本(4)——busybox运行环境

wils
wils

创作者俱乐部成员

前面没说清busybox.exe怎么使用,这里补充一下。

首先是下载:网址https://frippery.org/busybox/,下载这个32位的就行

然后放到文件夹:比如桌面上的test文件夹,里面的xlsm、txt文件是要处理的数据,busybox.exe和cgi-bin文件夹是web服务

其中aaa.txt是gbk编码的文本

cgi-bin/gbk.sh里的内容是

🔔

#!/bin/sh

echo -e 'Content-type: text/plain; charset=utf-8\n'

name=$(echo "$QUERY_STRING" | grep -oE 'name=[^&]*' | cut -d'=' -f2)

iconv -f gbk -t utf-8 "../${name}"

第一行声明使用sh脚本

第二行设置head里的编码是utf8

第三行里的$QUERY_STRING是fetch发送GET请求的url,这里使用grep命令获取name=value这段参数,cut命令按等号分隔取后面的值

第四行使用iconv转码gbk到utf-8,转码的文件名是从url传递过来的name变量

test.xlsm里的JS宏内容是

🔔

function tt()

{

Shell(`"${ThisWorkbook.Path}\\busybox.exe" sh -c "pkill httpd; httpd -h '${ThisWorkbook.Path}'"`, jsHide)

let name = "aaa.txt"

fetch(`http://localhost/cgi-bin/gbk.sh?name=${name}`)

.then(r=>r.text()).then(console.log)

}

Shell这一句是要启动httpd服务,其中pkill是先关闭已有的服务,之后httpd -h指定在当前xlsm文件所在文件夹启动服务

name是文件名变量

fetch的url里可以使用?name=value传递这个参数

之后还是把结果通过console.log输出到立即窗口

上面是一个可以运行的例子,有一些需要说明的:

  • busybox是当年为了把linux系统放入一张软盘(1.44M),做出来的很小的命令工具集,当运行busybox xxx命令时,就是在运行xxx命令,如果你把这个exe改名成sort,他运行起来就像sort.exe,改成sh.exe就是shell环境,而且,可以把自己写的sh脚本(文本文件)打包进exe,发给别人当成独立的程序来用,十分灵活方便

  • JS宏里的Shell启动httpd服务,每次都先pkill结束已有的httpd进程,再开启,有点浪费,其实启动一次就行(但还没想好怎么写简单😂

  • httpd启动的是个cgi服务器,cgi是20年前很流行的技术,当通过fetch访问cgi-bin文件夹里的脚本时,cgi服务器会把url当成变量$QUERY_STRING传递给脚本,会把Post请求的body当成stdin传递给脚本,会把脚本的stdout返回给请求方,所以cgi-bin里需要写的就是个从管道读取内容,从管道输出内容的最简单的脚本

  • 整个这个方式的目的就是写的简单,发给别人的包足够小,如果接口需要更复杂的计算,nodejs、python写个web接口更好,只是那样打包后有点大

广东省
浏览 976
1
5
分享
5 +1
1
1 +1
全部评论 1
 
方盛
方盛

创作者俱乐部成员

我不懂,但是为这么多字点赞
· 湖北省
1
回复