Unix(Minix)源码中shell命令执行位置及ls劫持方案问询
Minix系统ls命令触发位置与劫持实现方案
1. ls命令的执行触发链路
你之前猜测逻辑位于进程管理器(PM)的方向是内核态执行程序的通用入口,但ls命令的匹配与触发调用逻辑实际在用户态Shell程序中完成,Minix默认使用的Shell为ash,源码路径为src/bin/ash/,完整执行流程如下:
- 用户在终端输入的字符由tty驱动层传递给前台运行的Shell进程
- Shell在
src/bin/ash/parser.c中完成输入文本解析,拆分出命令名、参数、特殊符号等字段 - Shell进入
src/bin/ash/exec.c的执行逻辑:- 先判断是否为Shell内置命令(如cd、exit等,直接在Shell进程内执行逻辑),ls属于外部命令,进入外部命令处理分支
- 遍历
PATH环境变量的所有路径,拼接命令名得到完整可执行文件路径,匹配到/bin/ls后确认文件可执行 - 调用
fork()系统调用创建子进程,子进程调用execve()系统调用加载ls二进制文件运行,Shell父进程等待子进程执行完成
execve()系统调用的内核态处理逻辑确实位于src/minix/servers/pm/exec.c的do_exec()函数中,这是所有外部程序执行的通用内核入口,没有专门匹配ls的逻辑。
2. 不修改ls.c的劫持实现方案
根据你的需求,有两种可落地的实现方式:
方案1:Shell层修改(无内核改动,仅当前Shell生效)
直接修改ash的外部命令处理逻辑,无需改动内核和ls源码:
- 定位到
src/bin/ash/exec.c的外部命令处理分支,在加载可执行文件前增加判断:如果argv[0]字符串匹配为ls,跳过后续加载ls的逻辑,直接执行自定义操作(比如输出指定字符串、调用关机系统调用) - 修改完成后重新编译ash即可生效,仅影响使用该Shell的用户场景。
方案2:PM层修改(系统级全局生效)
如果需要所有用户、所有Shell调用ls都被劫持,修改内核PM的执行逻辑:
- 定位到
src/minix/servers/pm/exec.c的do_exec()函数,在加载可执行文件镜像前增加判断:如果待加载的程序路径为/bin/ls,则拒绝加载原ls程序,转而执行你定义的系统操作 - 该方案会全局拦截所有ls调用,修改后需要重新编译PM模块重启系统生效。
内容的提问来源于stack exchange,提问作者Cyberboy1551
相关产品推荐
相关产品推荐

