在adb shell中使用termux (2022年)

大类
Android
Env
技术标签
环境增强
优先级
Medium
开始日期
Nov 9, 2022
状态
Maintaining
Public
Public
最后更新
Nov 10, 2022

缘起

ADB的shell长什么样大家都有数,实在是没法用,每次都硬着头皮用可太要命了, 所以这回直接开干

长话短说

整体原理

配置之后,adb shell的调用路径应该是这样的:
  1. /system/etc/mkshrc:系统默认的rc,我们用magisk修改成让他调用外部的rc
      • 在这里只是简单的 . /sdcard/mkshrc
  1. /sdcard/mkshrc:我们可写的rc,用于进一步跳转到我们的模块
  1. /sdcard/adb_termux_shell/termux_shell.rc.sh:我们的模块,用su来switch到termux的用户启动辅助脚本
      • 在这里我们准备gosetuidgid,识别Termux的uid,并配置需要的gid
  1. /data/local/tmp/gosetuidgid:负责直接切换到termux的uid、gid、supplementary gid(sgid)
  1. /sdcard/adb_termux_shell/termux.sh:切换到termux用户的辅助脚本,负责启动termux环境
      • 在这里我们处理好selinux context、配置好termux所需的环境变量

具体配置

  1. 前提:安装好termux,打开内部存储的权限,确认能在termux里面访问/sdcard
  1. 配置系统mkshrc:把这个repo的https://github.com/NyaMisty/mkshrc作为zip下载下来,然后Magisk安装模块
  1. 下载这个repo:https://github.com/NyaMisty/adb_termux_shell,把全部文件放在/sdcard下面
      • 如果你的/sdcard/mkshrc本来有东西,那直接在后面写就可以了
  1. 这时adb shell就可以直接进入zsh了,同时你也可以直接在这里pkg install
 

路漫漫而修远兮 - 踩坑记录

  • 网上的脚本完全没有处理权限和selinux
    • 如果不降权,那么termux就会出现一堆权限错误
      • pkg命令直接拒绝在root下面装东西
      • 文件的所有者也会混乱
    • selinux不处理仍然会出错
      • 对于symbol link来说,缺少后面c1,c257…的selinux level会导致Permission denied
      • notion image
         
  • 降权远比预想的困难
    • 我一开始的想法是直接:su u0_a257 -c sh /data/data/com.termux/files/home/termux.sh
    • Android下降权看起来su XXX就可以降过去了,但是这样会丢失supplementary group,导致无法访问网络
      • notion image
    • android下的su、sudo、setuidgid都没有办法指定sgid,所以我只好自己写了一个
  • SELinux的修改也比预想的困难
    • 一开始以为需要使用libselinux里的setcon函数,但是找了一圈并没有setcon的命令
    • 考虑了一下要不要直接permissive,但是感觉太灵车了
    • 后来群里问了一下才知道可以直接写
      • notion image
    • 这样问题就解决了。同时,本来以为必须要完全重置成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