前言
从这篇开始使用gedit的同步显示markdown插件,安装了python3-markdown
。
然而我显示latex的努力失败了,如果要有LaTeX就只能放弃中文了。
(有趣的功能:点击markdown预览中的链接即可实现把gedit作为浏览器!)
问题描述
我上次安装了termux之后还有一个问题没有解决:用普通用户执行ssh
、clang
等等我自己装的程序时会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)。从此以后不要用普通用户做任何事。
然后我装了bc
和wget
。