缘起
ADB的shell长什么样大家都有数,实在是没法用,每次都硬着头皮用可太要命了, 所以这回直接开干
长话短说
整体原理
配置之后,adb shell的调用路径应该是这样的:
/system/etc/mkshrc
:系统默认的rc,我们用magisk修改成让他调用外部的rc- 在这里只是简单的
. /sdcard/mkshrc
/sdcard/mkshrc
:我们可写的rc,用于进一步跳转到我们的模块
/sdcard/adb_termux_shell/termux_shell.rc.sh
:我们的模块,用su来switch到termux的用户启动辅助脚本- 在这里我们准备
gosetuidgid
,识别Termux的uid,并配置需要的gid
/data/local/tmp/gosetuidgid
:负责直接切换到termux的uid、gid、supplementary gid(sgid)
/sdcard/adb_termux_shell/termux.sh
:切换到termux用户的辅助脚本,负责启动termux环境- 在这里我们处理好selinux context、配置好termux所需的环境变量
具体配置
- 前提:安装好termux,打开内部存储的权限,确认能在termux里面访问/sdcard
- 配置系统mkshrc:把这个repo的https://github.com/NyaMisty/mkshrc作为zip下载下来,然后Magisk安装模块
- 下载这个repo:https://github.com/NyaMisty/adb_termux_shell,把全部文件放在/sdcard下面
- 如果你的/sdcard/mkshrc本来有东西,那直接在后面写就可以了
- 这时adb shell就可以直接进入zsh了,同时你也可以直接在这里pkg install
路漫漫而修远兮 - 踩坑记录
- 网上的脚本完全没有处理权限和selinux
- 如果不降权,那么termux就会出现一堆权限错误
- pkg命令直接拒绝在root下面装东西
- 文件的所有者也会混乱
- selinux不处理仍然会出错
- 对于symbol link来说,缺少后面c1,c257…的selinux level会导致Permission denied
- 降权远比预想的困难
- 我一开始的想法是直接:
su u0_a257 -c sh /data/data/com.termux/files/home/termux.sh
- Android下降权看起来su XXX就可以降过去了,但是这样会丢失supplementary group,导致无法访问网络
- android下的su、sudo、setuidgid都没有办法指定sgid,所以我只好自己写了一个
- SELinux的修改也比预想的困难
- 一开始以为需要使用libselinux里的setcon函数,但是找了一圈并没有setcon的命令
- 考虑了一下要不要直接permissive,但是感觉太灵车了
- 后来群里问了一下才知道可以直接写
- 这样问题就解决了。同时,本来以为必须要完全重置成termux的untrusted_app的context,但是发现竟然magisk的context直接往/data写也是一样的
u:object_r:app_data_file:s0
,就只是差了个c1,c257,c512,c768
,所以只要补一下就可以了
- Termux的各种基础命令不支持selinux
- ls、id、chcon之类的全是按照不支持selinux编译的,完全没法用
- 引入
/data/data/com.termux/files/usr/xbin
目录用来装这种命令,在里面ln -s /system/bin的东西就可以了
- Termux的zsh默认不绑定home键,需要自己手动绑定
bindkey "^[[H" beginning-of-line bindkey "^[[F" end-of-line bindkey "^[[3~" delete-char