微头条丨使用 shell 脚本自动申请进京证 (六环外) —— debug 过程

2023-05-09 15:21:21 来源: 博客园
问题现象

用 shell 脚本写了一个自动办理六环外进京证的工具 《使用 shell 脚本自动申请进京证 (六环外)》,然而运行这个脚本总是返回以下错误信息:

{  "msg": "目前办理业务人数较多,请稍后再试。",  "code": 500}

咨询 woodheader/jjz 项目的作者,了解到问题就是出在请求头或参数上。仔细的检查了传入的各种参数,没有发现任何问题;修改 http 头的格式 (key 与 value 间增加空格),也没有丝毫改善。

写脚本花了两天,调试脚本花了三天却还没摸到门径,真是见了鬼了。有时候怀疑是自己被拉进反作弊名单了,切换另外一台设备的 source 和 authorization 后,结果还是出错,真是离了大谱。


(资料图片)

思路

目前在 android 设备的 App 上进行请求用同样的参数是可以办理成功的,并且有 VNET/Charles 的抓包数据。如果能对脚本的请求进行抓包,再将两者对比起来看,问题就容易暴露了。

Charles 抓包 curl

Charles 抓包的教程网上比较多,这里就不赘述了,需要注意的是和 VNET 一样,App 登录阶段不能抓包,否则登录界面调不出来。

Charles 可以抓 App 的报文,如果也能抓脚本的报文,两个一对比问题就水落石出啦~

经过一番百度,发现要让 Charles 抓命令行的报文还比较麻烦,需要配置两个环境变量:

export http_proxy=172.21.222.149:8888export https_proxy=172.21.222.149:8888

其中 172.21.222.149:8888 就是 Charles 开启代理的 IP 和端口:

然而开启抓包后,curl 要么失败,要么卡住,总是抓不到包:

> sh jinjing.sh check jq okcheck curl okcheck head okcheck cat okcheck awk okcheck grep okcheck date okstate req: {"v":"3.4.1","sfzmhm":"150121198603226428","s-source":"bjjj-android","timestamp":"1677810190000"}state headers:  -H Accept-Language:zh-CN,zh;q=0.8 -H User-Agent:okhttp-okgo/jeasonlzy -H source:8724a2428c3f47358741f978fd082810 -H authorization:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -H Content-Type:application/json;charset=utf-8 -H Host:jjz.jtgl.beijing.gov.cn -H Connection:Keep-Alive -H Accept-Encoding:gzip -H Content-Length:0jinjing.sh: line 99: [: too many argumentsquery permits status ok: id [] from user token does not match given [150121198603226428], fatal error!
VNET 抓包 curl

Charles 不行就想到了 VNET,不过它只能在 android 设备上抓包,如何让它抓 pc 上运行的 curl 呢?其实不难,把脚本放在设备上运行就好了。

adb shell 运行脚本

这个脚本只要有 shell 环境就能用,可移植性比较好,立马用 adb shell 发送到设备上试试:

> adb push jinjing.sh /sdcard/jinjing.sh: 1 file pushed, 0 skipped. 9.9 MB/s (11790 bytes in 0.001s)> adb push config.ini /sdcard/config.ini: 1 file pushed, 0 skipped. 0.2 MB/s (428 bytes in 0.002s)> adb shellPD1981:/ > cd /sdcardPD1981:/sdcard > mkdir jjzPD1981:/sdcard > mv jinjing.sh config.ini jjz/                                                                                                                                       PD1981:/sdcard > cd jjzPD1981:/sdcard/jjz > ls -lh total 16K-rw-rw---- 1 root everybody 428 2023-02-10 16:01 config.ini-rw-rw---- 1 root everybody 12K 2023-03-03 10:34 jinjing.shPD1981:/sdcard/jjz > sh jinjing.shjinjing.sh[1]: #!: inaccessible or not foundplease install jq before run this script, fatal error!

提示没有检测到 jq,这命令确实不是 android 标配,在 pc 上都需要安装,更不要说这种移动设备了。

arm jq

翻开 jq 官网下载页,各种预编译版本中没有 arm 平台的:

通过包管理器直接安装更是想都不要想。直接下载 linux 通用版本,无论是 32 位还是 64 位都不能执行:

> ./jq/system/bin/sh: ./jq: not executable: 32-bit ELF file> ./jq/system/bin/sh: ./jq: not executable: 64-bit ELF file

网上搜索了一下,找到一个 aarch64 平台的 rpm 包:jq-1.5-1.el7.aarch64.rpm

aarch64 应该就是 arm64 没错了,经过 cpio 解压后得到了里面的 jq 可执行文件:

> wget  https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/j/jq-1.5-1.el7.aarch64.rpm> rpm2cpio jq-1.5-1.el7.aarch64.rpm | cpio -div./usr/bin/jq./usr/lib64/libjq.so.1./usr/lib64/libjq.so.1.0.4./usr/share/doc/jq/AUTHORS./usr/share/doc/jq/COPYING./usr/share/doc/jq/README./usr/share/doc/jq/README.md./usr/share/man/man1/jq.1.gz873 blocks

将 ./usr/bin/jq push 到设备执行,还是不行:

PD1981:/data/local/tmp/jjz > file jqjq: ELF executable, 64-bit LSB arm64, dynamic (/lib/ld-linux-aarch64.so.1), BuildID=77ce7804044f5185df2d25650051ced0ea6bed94, strippedPD1981:/data/local/tmp/jjz > ./jq --versoin/system/bin/sh: ./jq: No such file or directory

这里还有一个小插曲,在默认的 /sdcard 目录执行可执行文件时失败:

> ./jq/system/bin/sh: ./jq: can"t execute: Permission denied

即使给了 jq 可执行权限也不行 (chmod),经过一番百度,发现需要放在另一个目录才可以:/data/local/tmp

交叉编译 jq

好在 jq 是开源的,可以直接基于源码编译,不过 android 设备上可没有编译环境,所以还得借助 linux 进行交叉编译。

#! /bin/shgit clone  https://github.com/stedolan/jq.gitcd jq# git submodule update --init# autoreconf will fail with following error:# ...# configure.ac:6: error: require Automake 1.14, but have 1.13.4# autoreconf: automake failed with exit status: 1mkdir buildcd build autoreconf -i ..CPATH="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/"../configure --without-oniguruma --disable-maintainer-mode  CFLAGS="-std=c99" --prefix=$PWD/install/ --host="armv7a-linux-androideabi21" CC="$CPATH/armv7a-linux-androideabi21-clang"  LD="$CPATH/arm-linux-androideabi-ld"  AR="$CPATH/arm-linux-androideabi-ar"makemake install

参考网上的一篇文章改了改,用上面这个脚本可以编译,前提是要有 android ndk 并将根目录设置到环境变量 ANDROID_NDK_HOME。

另外有两个小点需要注意:

不要下载 jq 库中的模块 (submodule),否则 autoreconf 需要更高的版本,在我的环境中会报错退出。下载模块主要目的是为了编译 oniguruma 正则匹配库,而我们是忽略这个库的,所以没必要个人习惯创建临时目录 (build) 进行编译,方便后期清理编译产物,然而在 jq 这里却遇到了麻烦,需要稍微做一点工作

第一个问题的报错信息:

> autoreconf -i .libtoolize: putting auxiliary files in `.".libtoolize: copying file `./ltmain.sh"libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4".libtoolize: copying file `m4/libtool.m4"libtoolize: copying file `m4/ltoptions.m4"libtoolize: copying file `m4/ltsugar.m4"libtoolize: copying file `m4/ltversion.m4"libtoolize: copying file `m4/lt~obsolete.m4"configure.ac:6: error: require Automake 1.14, but have 1.13.4autoreconf: automake failed with exit status: 1

这里我的 automake 刚好是 1.13.4 < 1.14,如果你的机器上版本大于等于 1.14,随便造。。

第二个问题的报错信息:

> make...  CC       src/lexer.lo  YACC     src/parser.cNOT building parser.c!  CC       src/parser.loclang: error: no such file or directory: "src/parser.c"clang: error: no input filesmake[2]: *** [src/parser.lo] Error 1make[2]: Leaving directory `/home/users/yunhai01/test/jq/build"make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/users/yunhai01/test/jq/build"make: *** [all] Error 2make  install-recursivemake[1]: Entering directory `/home/users/yunhai01/test/jq/build"make[2]: Entering directory `/home/users/yunhai01/test/jq/build"  YACC     src/parser.cNOT building parser.c!  CC       src/parser.loclang: error: no such file or directory: "src/parser.c"clang: error: no input filesmake[2]: *** [src/parser.lo] Error 1make[2]: Leaving directory `/home/users/yunhai01/test/jq/build"make[1]: *** [install-recursive] Error 1make[1]: Leaving directory `/home/users/yunhai01/test/jq/build"make: *** [install] Error 2

这里报 src/parser.c 找不到,然而在上一级目录中对应的位置却是有的,应该是 yacc 生成 .c 文件时放在了上一级目录,而使用 build 目录后 make 没有找到该文件,手动复制一下即可:

> cp ../src/parser.c src/> makemake  all-recursivemake[1]: Entering directory `/home/users/yunhai01/test/jq/build"make[2]: Entering directory `/home/users/yunhai01/test/jq/build"  CC       src/parser.lo  CCLD     libjq.la  CC       src/main.o  CCLD     jqmake[2]: Leaving directory `/home/users/yunhai01/test/jq/build"make[1]: Leaving directory `/home/users/yunhai01/test/jq/build"

应该是 jq 的一个小 bug,已提交 issue。

> file install/bin/jqjq: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped> adb push install/bin/jq /data/local/tmp/jjz/> adb shellPD1981:/ > cd /data/local/tmp/jjzPD1981:/data/local/tmp/jjz > chmod u+x jqPD1981:/data/local/tmp/jjz > export PATH="$PATH:$PWD"PD1981:/data/local/tmp/jjz > jq --versionjq-1.6-159-gcff5336-dirty

push 到设备就能用啦,这里为了脚本调用方便设置了 PATH 环境变量,断开 adb 后就失效了,需要每次登录都设置一下。

shell 数组初始化

有了 jq 就可以继续开开心心地跑脚本了,然而得到当头一棒:

> sh jinjing.shcheck jq okcheck curl okcheck head okcheck cat okcheck awk okcheck grep okcheck date okjinjing.sh[71]: syntax error: unexpected "("

看看 71 行的内容:

local stateheader=()

再普通不过的 shell 数组初始化语法,看起来非 bash 的 shell 不认,只好把它改成更通用的形式:

local stateheader

这丝毫不影响数组的初始化。

硬编码日期

继续运行脚本,这回跑通了,然而申请结果不正确:

{  "code": 500,  "msg": "进京日期不能为空!",  "data": null,  "from": "v2"}

再看设置的申请日期:

in effect from 2023-02-25 to 2023-03-03date: bad date +1 daysnew permit will start from

居然是空。原来是 adb shell 中的 date 不支持 "+1 days" 这种 unix date 语法:

PD1981:/data/local/tmp/jjz > date "+%Y-%m-%d" -d "+1 days"                                                                                                              date: bad date +1 daysPD1981:/data/local/tmp/jjz > date -v+1d "+%Y-%m-%d"                                                                                                                 date: Unknown option "v+1d" (see "date --help")

mac date 那种 "-v+1d" 也不支持,看 adb date 的说明:

$ date --helpToybox 0.8.4-android multicall binary: https://landley.net/toybox (see toybox --help)usage: date [-u] [-I RES] [-r FILE] [-d DATE] [+DISPLAY_FORMAT] [-D SET_FORMAT] [SET]Set/get the current date/time. With no SET shows the current date.-dShow DATE instead of current time (convert date format)-D+FORMAT for SET or -d (instead of MMDDhhmm[[CC]YY][.ss])-I RESISO 8601 with RESolution d=date/h=hours/m=minutes/s=seconds/n=ns-rUse modification time of FILE instead of current date-uUse UTC instead of current timezoneSupported input formats:MMDDhhmm[[CC]YY][.ss]     POSIX@UNIXTIME[.FRACTION]      seconds since midnight 1970-01-01YYYY-MM-DD [hh:mm[:ss]]   ISO 8601hh:mm[:ss]                24-hour time todayAll input formats can be followed by fractional seconds, and/or a UTCoffset such as -0800.All input formats can be preceded by TZ="id" to set the input time zoneseparately from the output time zone. Otherwise $TZ sets both.+FORMAT specifies display format string using strftime(3) syntax:%% literal %             %n newline              %t tab%S seconds (00-60)       %M minute (00-59)       %m month (01-12)%H hour (0-23)           %I hour (01-12)         %p AM/PM%y short year (00-99)    %Y year                 %C century%a short weekday name    %A weekday name         %u day of week (1-7, 1=mon)%b short month name      %B month name           %Z timezone name%j day of year (001-366) %d day of month (01-31) %e day of month ( 1-31)%N nanosec (output only)%U Week of year (0-53 start Sunday)   %W Week of year (0-53 start Monday)%V Week of year (1-53 start Monday, week < 4 days not part of this year)%F "%Y-%m-%d"   %R "%H:%M"        %T "%H:%M:%S"        %z  timezone (-0800)%D "%m/%d/%y"   %r "%I:%M:%S %p"  %h "%b"              %:z timezone (-08:00)%x locale date  %X locale time    %c locale date/time  %s  unix epoch time

也没看出来个所以然。搞不懂这个 adb date 了,好在只是调试,可以直接硬编码日期为一个合法值:

# mac date performs differs with other unix..if [ ${IS_MAC} -eq 1 ]; then     issuedate=$(date "-v+${expire}d" "+%Y-%m-%d")else     issuedate=$(date "+%Y-%m-%d" -d "+${expire} days")fiissuedate="2023-03-04"

然后就成功了!

{  "code": 200,  "msg": "信息已提交,正在审核!",  "data": [    "温馨提示",    "1、请务必在进京之前,查看进京通行证是否审核通过;",    "2、若审核未通过,请按提示信息调整并重新申请;",    "3、若审核通过,可在证件生效之前申请取消,每位注册用户每天仅有1次取消机会;",    "4、在进京通行证未生效的情况下,外埠机动车禁止在限行区域内行驶;"  ],  "from": "v2"}
VNET

本来要抓出错的报文进行对比,没想到 adb shell 上居然歪打正着跑通了,这下 VNET 抓包也没什么用了,虽然通过指定 shell 可以实现抓包:

可以看到,http 头中的 Key 名称重复了,应该是 VNET 显示的问题。另外对比 Charles 与 VNET 的抓包结果,发现以下字段是 VNET 自己加的:

ip: 203.34.106.199type: POSTtime: 2023-03-03 15:48:51size: 705code: 200

可能是为了显示方便,在脚本里加这些参数纯粹是画蛇添足,所以我都删掉了。

这里有一个小插曲,如果不打开 curl 的 -k 参数,VNET 抓包会导致 curl 请求卡死,且 VNET 也抓不到包,这是通过 -v 选项发现的:

curl: (60) SSL certificate problem: self signed certificate in certificate chainMore details here: https://curl.haxx.se/docs/sslcerts.htmlcurl failed to verify the legitimacy of the server and therefore could notestablish a secure connection to it. To learn more about this situation andhow to fix it, please visit the web page mentioned above.
升级 curl

走到这一步就很有意思了:pc 上 curl 失败、android 上成功;pc 上能抓 App 包、抓不到 curl 包;android 上能抓两者的包但是都成功没有对比意义。

现在能直接对比的只有 pc 上的 curl 和 android 的上 curl,于是对比了一下两者的版本:

macOS:> curl -Vcurl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0Release-Date: 2019-03-27Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSocketsCentOS:> curl -Vcurl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.53.1 zlib/1.2.7 libidn/1.28 libssh2/1.8.0Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets android:> curl -Vcurl 7.73.0 (Android) libcurl/7.73.0 BoringSSL zlib/1.2.11Release-Date: 2020-10-14Protocols: file http https mqtt Features: AsynchDNS HTTPS-proxy IPv6 libz NTLM SSL UnixSockets

其实是三者,pc 有两个:一个 linux,一个 mac。发现它们版本都不尽相同,不过 android 上的版本比 pc 的都大,可以考虑升级 linux 的版本到 7.87 尝试。

这里没有再用源码编译安装的方式,直接下载一个 linux x86 版本完事:

> bin/curl -Vcurl 7.87.0 (x86_64-pc-linux-muslx32) libcurl/7.87.0 OpenSSL/1.1.1s zlib/1.2.12 libssh2/1.9.0 nghttp2/1.43.0Release-Date: 2022-12-21Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftpFeatures: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL threadsafe TLS-SRP UnixSockets> pwd/home/users/yunhai01/tools> echo $PATH/home/yunh/.BCloud/bin:/home/users/yunhai01/.local/bin:/home/users/yunhai01/bin:/home/users/yunhai01/tools/bin:/home/users/yunhai01/project/android-ndk-r20:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/opt/bin:/home/opt/bin:/home/users/yunhai01/tools/node-v14.17.0-linux-x64/bin> curl -Vcurl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.53.1 zlib/1.2.7 libidn/1.28 libssh2/1.8.0Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets > type curlcurl is hashed (/usr/bin/curl)> whereis curlcurl: /usr/bin/curl /home/users/yunhai01/tools/bin/curl /usr/share/man/man1/curl.1.gz

这里有一个小插曲,即使我将新下载的 curl 所在的路径 (tools/bin) 放在了 PATH 环境变量当中,访问 curl 时仍是访问系统自带的那个,只得将脚本中所有 curl 通过指定全路径的方式来切换为新版。

最后在 linux 上执行脚本仍失败。

对比 curl 输出

走到这儿我是真的郁闷了。既然不能抓包,那就对比 curl -v 输出吧!索性脚本已经能在 android 上跑通了,有个可以对比的基准了:

过滤掉一些版本的差异,发现了最重要的区别:Content-Length,android 上的长度是 340,而 pc 上只有 304。长度不足会导致 post 数据被截断,服务器返回 500,这就说通了。

那为何相同的请求数据会得到不同的长度呢?先看看请求数据到底是多长:

> echo ${issue_req} {"dabh":"null","hphm":"津ADY1951","hpzl":"52","vId":"1479816562371952600","jjdq":"海淀区","jjlk":"00401","jjlkmc":"京藏高速","jjmd":"01","jjmdmc":"自驾旅游","jjrq":"2023-03-04","jjzzl":"02","jsrxm":"云海","jszh":"150121198603226428","sfzmhm":"150121198603226428","xxdz":"百度大厦","sqdzbdjd":116.307393,"sqdzbdwd":40.057771}$ echo ${issue_req} | wc -c     341$ echo ${#issue_req}304

果然是请求成功的 340,其中多了个 1 是结尾换行。而脚本中指定的 Content-Length 是通过 shell 字符串长度获取的 (${#issue_req}),这个在 pc 上果然是 304。

所以问题的根因就清楚了,是错误的将 shell 字符串长度做为了数据长度,当数据内容中不包含汉字时,它俩是一致的,这也是为什么 stateList 可以请求成功的原因;而当数据中包含 utf-8 汉字后,一个汉字占用 3 个字节,在 shell 字符串中却只统计了一次,所以导致长度偏小。

这正是 —— 踏破铁鞋无觅处,得来全不费功夫啊!明明感觉只隔了一层窗户纸,没想到捅破它却用尽了浑身的力气,哈哈~

痛定思痛,不要使用 shell 字符串长度作为数据长度就是这个 bug 的经验教训。

复盘

最后来复盘一下,为何 adb shell 中包含汉字的字符串长度就能等于数据长度呢?下面做个小实验:

> data="{"dabh":"null" "hphm":"津ADY1951" "hpzl":"52" "vId":"1479816562371952600" "jjdq":"海淀区" "jjlk":"00401" "jjlkmc":"京藏高速" "jjmd":"01" "jjmdmc":"自驾旅游" "jjrq":"2023-03-04" "jjzzl":"02" "jsrxm":"云海" "jszh":"150121198603226428" "sfzmhm":"150121198603226428" "xxdz":"百度大厦" "sqdzbdjd":116.307393 "sqdzbdwd":40.057771}"> echo "${data}"{"dabh":"null" "hphm":"津ADY1951" "hpzl":"52" "vId":"1479816562371952600" "jjdq":"海淀区" "jjlk":"00401" "jjlkmc":"京藏高速" "jjmd":"01" "jjmdmc":"自驾旅游" "jjrq":"2023-03-04" "jjzzl":"02" "jsrxm":"云海" "jszh":"150121198603226428" "sfzmhm":"150121198603226428" "xxdz":"百度大厦" "sqdzbdjd":116.307393 "sqdzbdwd":40.057771}> echo ${#data}304> cat test.sh#! /bin/shdata="{"dabh":"null" "hphm":"津ADY1951" "hpzl":"52" "vId":"1479816562371952600" "jjdq":"海淀区" "jjlk":"00401" "jjlkmc":"京藏高速" "jjmd":"01" "jjmdmc":"自驾旅游" "jjrq":"2023-03-04" "jjzzl":"02" "jsrxm":"云海" "jszh":"150121198603226428" "sfzmhm":"150121198603226428" "xxdz":"百度大厦" "sqdzbdjd":116.307393 "sqdzbdwd":40.057771}"echo ${#data}echo "${data}" | wc -c > sh test.sh340341

发现两个有趣的现象:

直接将数据赋给 adb shell 变量时,长度是 304 短缺 (注意如果不将 data 用双引号括住,json 数据的外花括号将缺失,不清楚为何)调用 shell 脚本赋值给 shell 变量时,长度为 340 正常,与 wc 的输出仅差了一个换行,可以看作是一致的

adb shell 在交互执行和脚本执行时行为还不一样,这真是离大谱。感兴趣的读者可以进一步探究,我是查不动了。。

结语

本文记录了一个脚本不工作的排查过程,在尝试抓包进行报文对比思路的引导下,分别探索了 Charles pc 抓 curl -> VNET android 抓 curl -> jq arm 交叉编译 -> 去除 shell 数组初始化 -> 去除 date +1 -> 升级 curl -> 对比 pc 和 android 上的 curl -v 输出,最终定位到了问题根因:使用 shell 字符串长度作为数据长度、在操作 utf-8 汉字数据时计算了错误的 Content-Length、从而引发了服务端返回错误响应的过程。

bug 没什么神奇的,甚至有点低级,说出来还有点不好意思。不过探索问题的过程就是这样,不到最后一刻,永远不知道自己被多么小的错误绊倒了。虽然错误低级,排查的过程还是蛮高大上的,总体思路也是正确的,只是在具体的摸索过程中走了不少弯路,回头来看看,也蛮有意思,特别是 android adb shell,真的对它产生了新的认知。

adb shell 拓展了 shell 脚本运行的平台,之前写的好多脚本,其实都可以称到 android 设备上跑。这方面有一个 Termux 可用,如果再和定时执行联系起来,大有可为,一机在手走遍天下,这样看 linux 服务器都可以省了,哈哈~

后记

在写这篇文章的时候,又对上述流程做了个梳理,补充两个新的情况。

arm jq

正文使用的是 rpm 包,我在搜索时又找到一个 deb 包:jq_1.6-1ubuntu0.20.04.1_arm64.deb

> wget  http://ports.ubuntu.com/pool/universe/j/jq/jq_1.6-1ubuntu0.20.04.1_arm64.deb> ar -vx jq_1.6-1ubuntu0.20.04.1_arm64.deb x - debian-binaryx - control.tar.xzx - data.tar.xz> tar xvf data.tar.xzx ./x ./usr/x ./usr/bin/x ./usr/bin/jqx ./usr/share/x ./usr/share/doc/x ./usr/share/doc/jq/x ./usr/share/doc/jq/AUTHORS.gzx ./usr/share/doc/jq/copyrightx ./usr/share/man/x ./usr/share/man/man1/x ./usr/share/man/man1/jq.1.gzx ./usr/share/doc/jq/READMEx ./usr/share/doc/jq/changelog.Debian.gz

将它解压并推送到设备上,还是没效果,看来还必需走交叉编译这步了。

Charles 抓包 curl

设置 http_proxy/https_proxy 环境变量后,启动脚本,Charles 抓到 curl 的包了:

curl 也正常返回了,之前卡死或失败的场景不再复现了,神奇。

如果当时这一步走通的话,就可以直接对比 curl 的报文与 App 的报文找到原因了!而不用绕这么大一圈,Charles 坑我~

后来回想一下,可能是为 curl 增加了 -k 选项的缘故。

参考

[1]. Linux bash终端设置代理(proxy)访问

[2]. Download jq

[3].rpm文件解压

[4]..deb文件的解压与压缩

[5]. how-to-set-executable-permissions-on-a-file-in-android-to-execute-using-runtime

[6].jq的交叉编译

[7].Shell curl 命令报错:(60) SSL certificate problem: self signed certificate

[8]. curl download

[9].Linux shell统计字节数、字数、行数

标签:

微头条丨使用 shell 脚本自动申请进京证 (六环外) —— debug 过程

写好的自动办理六环外进京证脚本跑不通,总是返回办理业务人数较多(500)错误,Charles VNET抓包、android交

05-09 15:21:21

惊喜感满满的小车 极核AE6+试驾报告|全球视点

今天我们有幸借到了极核AE6+!说实话骑这个车上路必须穿摩托车的装备外加后面这块黄牌,以此证明我们机动车

05-09 15:06:12

身材这么辣,这姐竟然53岁了?

谁不爱漂亮姐姐呢?

05-09 14:34:00

明确医疗属性为医美服务正本清源

近日,市场监管总局、公安部、商务部、国家卫生健康委、海关总署、国家税务总局、国家网信办、国家中医药管

05-09 13:55:05

一人火力抗衡一队!朗尼-沃克末节独揽15分 勇士全队仅得17分|播报

NBA季后赛次轮G4,湖人104-101力克勇士,3-1拿到赛点。朗尼-沃克出战27分钟,末节9中6,独得15分,帮助球队

05-09 13:02:19

天天快讯:牵牛花怎么画简单好看 色彩鲜艳的喇叭花,步骤讲解很详细,彩铅零基础教程

喇叭花,又名牵牛花,喇叭花花色艳丽,花冠呈漏斗状,花色众多有蓝、红、紫、白等,是城乡庭院非常常见的一种

05-09 12:50:23

每日消息!中规中矩!詹姆斯半场11中5得到11分5板 正负值-14两队最低

季后赛次轮G4,湖人半场49-52勇士。半场比赛,詹姆斯表现中规中矩。他出战21分钟,投篮11中5,三分3中1,没

05-09 12:09:52

北京中轴线数字资源库成果发布

央视网消息:在北京,从钟鼓楼一路往南,途经万宁桥、故宫等直至永定门,有一条纵贯南北的中轴线,虽称...

05-09 11:53:54

看热讯:recovery恢复出厂设置有什么不同 recovery恢复出厂设置

今天来聊聊关于recovery恢复出厂设置有什么不同,recovery恢复出厂设置的文章,现在就为大家来简单介绍下re

05-09 11:20:39

自学转型,不一定是好事_环球热推荐

现在各类互联网上平台里,你可以搜索一些关键词,非常轻松找到各种转型的学习资料,比如打算转型做产品经理

05-09 10:49:46

购房合同未备案无法办按揭 抚州金地时代艺境楼盘开发商被约谈

付了首付款签了合同,银行却拒绝办理按揭,原因是购房合同没有通过网签备案……近日,网友徐先生向大江...

05-09 10:19:55

whatsapp在线注册_WhatsApp怎么注册 怎么用-世界速讯

1、WhatsApp注册流程如下:通过应用中心下载whatsapp软件,打开该软件进入欢迎页面,whatsapp支持io

05-09 09:48:45

体验劳动的快乐 天天快播报

通过本次活动,同学们通过自己动手栽种,体会到劳动的艰辛与不易,感受到劳动所带来的的喜悦。

05-09 09:38:06

民俗学者八云树漫画(民俗学者八云树01)

当前大家对于民俗学者八云树01都是颇为感兴趣的,大家都想要了解一下民俗学者八云树01,那么小美也是在网络

05-09 08:56:36

聊天记录曝光!涉事教师已被开除!

2020年7月21日,教育部官网发布的关于《外籍教师聘任和管理办法(征求意见稿)》,其中规定:外籍教师有性

05-09 08:14:17

图片新闻丨把牢安全生产关

近日,湖北省江陵县检察院检察官深入辖区木业公司,实地调研企业安全生产情况,督促企业强化员工的安全意识,重

05-09 07:22:31

信息:高中选修课程有哪些_高中的选修课有哪些 必修课又有哪些

1、语数、物理、化学、生物、历史、政治、地理。2、每门除了政治没有选修,英语有四本选修之外,都有两本选

05-09 06:33:25

今秋季征兵宣传登记开始|今亮点

今秋季征兵宣传登记开始---近日,在武汉市财贸学校,武汉市江岸区人武部干部进校进行主题为“我以青春固...

05-09 05:48:22

普及防灾减灾知识 提高自救互救能力——崇信县科协开展防灾减灾知识进乡镇活动-天天速读

为不断增强广大人民群众防灾减灾安全防范意识和自然灾害自救互救能力,持续提升人民群众安全感,进一步推动

05-09 03:55:26

世界新消息丨电路无功功率计算公式_无功功率计算公式

1、其计算公式为:P=U×Icosφ。2、其中的φ指的是电压和电流的相位差。3、在电力网的运行中,功率因数反映

05-09 01:41:31

入党申请书格式样本疫情 入党申请书格式样本 环球热点

今天来聊聊关于入党申请书格式样本疫情,入党申请书格式样本的文章,现在就为大家来简单介绍下入党申请书格

05-08 23:24:25

金融股罕见集体暴涨,原因何在?

5月8日,银行股出现近年罕见的集体暴涨,成为带动上证指数领涨的主力。周一早盘,工农中建四大行均出现暴涨

05-08 22:17:13

天天观察:V观财报|30万股民哭了!5月以来11家公司拉响退市警报

V观财报|30万股民哭了!5月以来11家公司拉响退市警报,股民,深交所,上市公司,退市警报,公司股票

05-08 21:29:49

热点在线丨粉防己和木防己区别_木防己和汉防己的区别

1、汉防己质坚体重,粉性大,断面类白色,平坦细腻 木防己质轻如木通,断面淡黄白色 也可以找中医辨认下。本文

05-08 20:46:04

河南新乡市总工会为万名职工筑起健康“防护墙” 每日快讯

河南日报客户端记者王绿扬通讯员贺开典5月6日上午,河南省总工会“关爱职工健康体检送温暖”活动(新乡...

05-08 20:11:58

天天信息:江西强降雨造成53.6万人受灾 直接经济损失6.7亿元

总台记者从江西省应急管理厅了解到,5月5日至8日16时30分,本轮强降雨灾害过程已造成抚州市、吉安市、宜春

05-08 19:22:58

三款创新产品喜获重要进展,远大医药(00512)科技创新布局助力核药、呼吸及眼科多板块业务协同发展

远大医药(00512)先后公布多项创新产品进展,涉及核药抗肿瘤诊疗、呼吸及重症抗感染、眼科三大创新研发管线。

05-08 18:37:04

快播:孟聚

1、孟聚是长篇玄幻类东方玄幻小说《斗铠》的主人公。文章到此就分享结束,希望对大家有所帮助。

05-08 18:04:31

独山子公安为企业节约万元换证费

近日,新疆克拉玛依市公安局独山子区分局交警大队民警前往独山子石化公司仓储运输中心运输一部进行走访时了

05-08 17:31:39

常德市红十字会开展“生命教育 救在身边”主题宣传活动-世界热点评

为纪念第76个世界红十字日,进一步弘扬“人道、博爱、奉献”的红十字精神,常德市红十字会联合常德市卫...

05-08 17:05:47

美单方面退出伊核协议已五年 伊朗民众:美滥用制裁霸凌成性

2018年美国退出伊核协议后,不断追加针对伊朗的制裁,涉及伊朗金融、工业、能源等各行各业,并导致伊朗出现

05-08 16:55:30

儿女传奇鬼门关下载 1080P 1080P 儿女传奇鬼门关-全球视点

今天来聊聊关于儿女传奇鬼门关下载,1080P,1080P,儿女传奇鬼门关的文章,现在就为大家来简单介绍下儿女传

05-08 16:09:05

热文:哈尔滨超高速磁浮!时速达1000公里以上的大众交通方式

5月8日,哈尔滨工业投资集团与北京九州动脉公司举行超高速磁浮旅游试验线建设合作协议签约仪式。超高速管道

05-08 16:00:11

天天快消息!蔡志忠开讲啦名言 蔡志忠开讲

今天来聊聊关于蔡志忠开讲啦名言,蔡志忠开讲的文章,现在就为大家来简单介绍下蔡志忠开讲啦名言,蔡志忠开

05-08 15:15:04

苏州破2万亿!南京无锡紧随其后,中国第一强省之争到了关键时刻 世界热门

近日,苏州市官方公布了2022年全市GDP数据,GDP总量首次突破2万亿大关。这一消息引起了社会各界的关注,也

05-08 14:22:24

焦点热门:鲁阳节能:根据外部发展环境变化以及公司生产经营实际,2023年公司提出了“精心组织,实现满产满销;精耕细作

同花顺金融研究中心5月8日讯,有投资者向鲁阳节能提问,您好,就一季报表面来看,公司今后一段时间的目标,

05-08 13:29:53

异动快报:力盛体育(002858)5月8日13点0分触及涨停板 世界消息

5月8日盘中消息,13点0分力盛体育(002858)触及涨停板。目前价格27 09,上涨9 99%。其所属行业体育目前上

05-08 12:52:17

淡斑的小妙招?|世界快看点

、美白茶水祛斑法洗面后,把茶水抹在脸上,并用手轻轻拍打脸,或者把沾了茶水的脱脂棉粘在脸上,2-3分钟;然后用

05-08 12:11:37

羊肉汤怎么炖最有营养又好喝简单

关于羊肉汤怎么炖最有营养又好喝简单的内容,包含怎么炖羊肉汤更有营养羊肉汤怎么炖好喝又营养羊肉汤怎么炖

05-08 11:55:41

【全球速看料】中超控股董秘回复:根据《上市公司股权激励管理办法》第二十三条规定“上市公司在授予激励对象限制性股票时

中超控股(002471)05月08日在投资者关系平台上答复了投资者关心的问题。

05-08 11:26:07

首条中低速磁浮盾构隧道贯通 全球新资讯

据北京5月6日电(记者樊曦)记者从中国铁建股份有限公司了解到,6日,在长沙黄花机场改扩建工程T3航站楼地

05-08 10:58:05

一所跨界融合的职业学院|天天快资讯

日前落幕的2023年江苏省职业院校技能大赛传来喜讯,苏州工业园区服务外包职业学院(以下简称“服务外包...

05-08 10:28:13

金巧福黄金价格今天多少一克(2021年07月28日)

如对实物黄金投资有何疑问可咨询本站客服。

05-08 10:10:51

平舆县老王岗乡召开低保、特困复核工作动员部署会

河南经济报记者张明洋通讯员苏玲董静5月6日上午,平舆县老王岗乡召开2023年乡镇低保和特困复核工作动员部署

05-08 09:24:15

当前快讯:燃料油宏观扰动仍存 高低硫基本面出现边际变化

原油:库存结构决定原油难以转为近月贴水■市场分析从库存数据的现实来看,在经历了一季度的大幅累库之后,

05-08 09:02:46

森萱医药:5月5日融资买入30.66万元,融资融券余额214.88万元

5月5日,森萱医药(830946)融资买入30 66万元,融资偿还0 4万元,融资净买入30 27万元,融资余额214 88万元。

05-08 08:20:35

茂名市驴充充科技有限公司_关于茂名市驴充充科技有限公司的简介

音频解说1、茂名市驴充充科技有限公司于2020年01月10日成立。法定代表人廖进金,公司经营范围包括:计算机

05-08 07:55:35

绿茶妹演员表_绿茶妹演员表介绍

欢迎观看本篇文章,小勉来为大家解答以上问题。绿茶妹演员表,绿茶妹演员表介绍很多人还不知道,现在让我们

05-08 06:50:18

梦兆册七星彩号码查询偷_梦兆册七星彩号码查询

1、你好,这东西没人会预测。2、如果真会预测,早就成为亿万富翁了。3、预测这东西我早就不信了,以前在网

05-08 06:04:57

今日热搜:套曲_关于套曲的介绍

1、套曲(Divertimento)包括若干乐曲组成的成套器乐曲或声乐曲,其中有主题的内在联系和联贯发展的关系。2

05-08 03:42:22

惊喜感满满的小车 极核AE6+试驾报告|全球视点
身材这么辣,这姐竟然53岁了?
明确医疗属性为医美服务正本清源
一人火力抗衡一队!朗尼-沃克末节独揽15分 勇士全队仅得17分|播报
天天快讯:牵牛花怎么画简单好看 色彩鲜艳的喇叭花,步骤讲解很详细,彩铅零基础教程
每日消息!中规中矩!詹姆斯半场11中5得到11分5板 正负值-14两队最低
北京中轴线数字资源库成果发布
看热讯:recovery恢复出厂设置有什么不同 recovery恢复出厂设置
自学转型,不一定是好事_环球热推荐
购房合同未备案无法办按揭 抚州金地时代艺境楼盘开发商被约谈
whatsapp在线注册_WhatsApp怎么注册 怎么用-世界速讯
体验劳动的快乐 天天快播报
民俗学者八云树漫画(民俗学者八云树01)
聊天记录曝光!涉事教师已被开除!
图片新闻丨把牢安全生产关
信息:高中选修课程有哪些_高中的选修课有哪些 必修课又有哪些
今秋季征兵宣传登记开始|今亮点
普及防灾减灾知识 提高自救互救能力——崇信县科协开展防灾减灾知识进乡镇活动-天天速读
世界新消息丨电路无功功率计算公式_无功功率计算公式
入党申请书格式样本疫情 入党申请书格式样本 环球热点
金融股罕见集体暴涨,原因何在?
天天观察:V观财报|30万股民哭了!5月以来11家公司拉响退市警报
热点在线丨粉防己和木防己区别_木防己和汉防己的区别
河南新乡市总工会为万名职工筑起健康“防护墙” 每日快讯
天天信息:江西强降雨造成53.6万人受灾 直接经济损失6.7亿元
三款创新产品喜获重要进展,远大医药(00512)科技创新布局助力核药、呼吸及眼科多板块业务协同发展
快播:孟聚
独山子公安为企业节约万元换证费
常德市红十字会开展“生命教育 救在身边”主题宣传活动-世界热点评
美单方面退出伊核协议已五年 伊朗民众:美滥用制裁霸凌成性
儿女传奇鬼门关下载 1080P 1080P 儿女传奇鬼门关-全球视点
热文:哈尔滨超高速磁浮!时速达1000公里以上的大众交通方式
天天快消息!蔡志忠开讲啦名言 蔡志忠开讲
苏州破2万亿!南京无锡紧随其后,中国第一强省之争到了关键时刻 世界热门
焦点热门:鲁阳节能:根据外部发展环境变化以及公司生产经营实际,2023年公司提出了“精心组织,实现满产满销;精耕细作
异动快报:力盛体育(002858)5月8日13点0分触及涨停板 世界消息
淡斑的小妙招?|世界快看点
羊肉汤怎么炖最有营养又好喝简单
【全球速看料】中超控股董秘回复:根据《上市公司股权激励管理办法》第二十三条规定“上市公司在授予激励对象限制性股票时
首条中低速磁浮盾构隧道贯通 全球新资讯
一所跨界融合的职业学院|天天快资讯
金巧福黄金价格今天多少一克(2021年07月28日)
平舆县老王岗乡召开低保、特困复核工作动员部署会
当前快讯:燃料油宏观扰动仍存 高低硫基本面出现边际变化
森萱医药:5月5日融资买入30.66万元,融资融券余额214.88万元
茂名市驴充充科技有限公司_关于茂名市驴充充科技有限公司的简介
绿茶妹演员表_绿茶妹演员表介绍
梦兆册七星彩号码查询偷_梦兆册七星彩号码查询
今日热搜:套曲_关于套曲的介绍
快看点丨最新积分排名!张本智和爆冷输球仍高居第一!世界冠军仅第八
X 广告
行业动态
X 广告

Copyright ©  2015-2022 青年植物网版权所有  备案号:皖ICP备2022009963号-20   联系邮箱:39 60 291 42@qq.com