在 unix (Minix) 源代码中执行的 shell 命令在哪里?
Posted
技术标签:
【中文标题】在 unix (Minix) 源代码中执行的 shell 命令在哪里?【英文标题】:Where are shell commands executed inside the unix (Minix) source code? 【发布时间】:2021-12-07 21:43:09 【问题描述】:我目前正在学习操作系统内核以及如何从源代码构建它们(我使用的是 Minix)。
我试图找出 shell 命令(例如 ls)在哪里执行。我知道在哪里可以找到 ls.c 文件 (src/bin/ls) 我只是不确定当用户在终端中键入它时它在哪里被调用。
我的目标是“劫持” ls 命令以完成不同的结果,而无需编辑命令文件本身 ls.c(例如,ls 命令现在关闭计算机或回显字符串)。为了做到这一点,我需要知道来自用户的文本在哪里被解析以及 ls 命令被执行。
我查看了源代码,我相信它位于进程管理器 (src/minix/servers/pm) 中,但是,这是我迷路之前所获得的。 p>
我知道这是一个非常具体的问题,但希望我能解决它。 提前致谢
【问题讨论】:
shell 将调用exec
系列函数之一来加载和执行程序。在尝试使用类 Unix 内核之前,请先了解更多关于 Unix 系统编程的知识。
如果要“劫持”,最简单的方法:使用shell别名,第二种最简单的方法:将/bin/ls移入/bin/ls.orig,在/下放一个命令或脚本bin/ls(在大多数情况下会自称为 /bin/ls.orig)。注意 shell 可以实现 ls 内置(对于最常见的情况)并且程序可以直接调用系统。
@GiacomoCatenazzi 确实,shell 内置函数帮助了 UNIX 历史上一些最神奇的恢复 :)
【参考方案1】:
您将两个不同的问题混合在一起:ls
二进制文件在哪里,其源代码在哪里。对于前一个问题,您可以使用which
来确定其绝对路径。例如,在我的 FreeBSD 机器上,which ls
输出 /bin/ls
。但是ls
是编译后的二进制文件,不修改源代码重新编译是不能轻易被“劫持”的,这是后面的问题。您已经确定了ls
的正确路径:src/bin/ls
,因此您需要根据需要修改ls.c
并编译它,然后选择安装到您的系统中。我对 Minix 构建系统不太熟悉,但您可以随时查阅 Minix 文档以了解如何安装更新的用户空间程序。
【讨论】:
是的,对不起,如果我的问题有点令人困惑。 Ls 只是一个例子。我一直在寻找更多内容,并找到了我正在寻找的文件 (src/bin/sh/exec.c),它处理来自同一目录中 main.c 中的 cmdloop 函数的命令的执行。我澄清的问题是:将'ls ...'映射到ls.c的那种'字典'在哪里? shell如何解析我输入到命令中的文本? @Cyberboy1551 没有这样的“字典”可以将命令映射到源文件。你知道 C 源文件被编译和链接成单独的可执行文件,然后与源文件完全无关? @Cyberboy1551 至于exec
函数,它会寻找executable程序来加载和执行。我真的恳请您退后几步,先学习 C 编程的基础知识,然后再学习 Unix 系统编程的基础知识,然后再尝试在内核级别工作。
@Cyberboy1551 有字典映射。 shell首先将你的命令和参数解析成一个带有shell变量和控制语句的数组(这是一个复杂的过程)。例如,ls -al -h
被解析为ls
和["-al", "-h"]
的数组。然后,shell fork()
和exec(ls, <arg array>)
程序。 ls
的位置是使用 PATH
环境变量找到的。以上是关于在 unix (Minix) 源代码中执行的 shell 命令在哪里?的主要内容,如果未能解决你的问题,请参考以下文章