You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的执行逻辑:
    1. 先判断是否为Shell内置命令(如cd、exit等,直接在Shell进程内执行逻辑),ls属于外部命令,进入外部命令处理分支
    2. 遍历PATH环境变量的所有路径,拼接命令名得到完整可执行文件路径,匹配到/bin/ls后确认文件可执行
    3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:01