修正termux在root登录之后无法打开的问题

Posted by wyj on November 22, 2019

前言

从这篇开始使用gedit的同步显示markdown插件,安装了python3-markdown

然而我显示latex的努力失败了,如果要有LaTeX就只能放弃中文了。

(有趣的功能:点击markdown预览中的链接即可实现把gedit作为浏览器!)

问题描述

我上次安装了termux之后还有一个问题没有解决:用普通用户执行sshclang等等我自己装的程序时会RE,显示找不到运行时库。

今天我尝试apt update之后,普通用户又一次无法进入termux了:连bash的运行时库都找不到了。然而我不想再次重装。经过了一个多小时的探索,我终于完成了修补。

解决方案

step 1

写一个termux版的sudo.c。然而众所周知只有/system里面能放带有suid的程序,termux是怎么sudo的呢?

我原来的sudo.c逻辑是这样的:输入sudo sh,执行system("sh")。显然这个sudo执行sudo bash的时候会出锅,因为bash需要的动态链接库不在$LD_LIBRARY_PATH中。于是我把sudo.c加了一句话,改为输入sudo sh,执行system("export LD_LIBRARY_PATH=/*省略*/; sh")。现在就可以正常的执行sudo bash了。

把这个sudo.c用clang编译,生成的可执行文件丢到/system/bin中。注意不是chmod +x sudo;chmod +s sudo就管用的,因为此时普通用户没有读的权限。应该chmod 4755 sudo

step 2

用sh代替bash的功能。我记得曾经在知乎上搜过”为什么sh还没有退出历史舞台“之类的问题,有一个回答说的很好:sh的依赖库只有标准C库,然而bash的依赖库很多,所以sh的可移植性好于bash。现在我真正见识到了这个场景。

把bash移动成bash.old,这样termux就会自动调用sh,并且sh是可以正常执行的。不要忘了把所有文件改成755,因为默认权限是700。

step 3

创建一个bash.sh,里面内容如下:

#!/system/bin/sh
/system/bin/sudo /data/data/com.termux/files/usr/bin/bash.old --login

这里sudo要写绝对路径是因为termux的sh调用系统自带的shell时,不会把系统的$PATH加入path中。赋予这个脚本执行权限。

另外,在.bashrc里面把$PATH加上/data/data/com.termux/files/usr/bin。加在最前面。

现在打开termux,运行bash.sh,就可以获得一个root权限的bash,一切操作正常,并且方法比之前简单多了(之前是先su,再设置运行时库路径,然后用绝对路径启动bash)。从此以后不要用普通用户做任何事。

然后我装了bcwget