我要做一个终端登陆系统,要求去掉某些linux固有的shell命令,并增加一些自己写的命令,怎么搞?

我要做一个终端登陆系统,要求去掉某些linux固有的shell命令,并增加一些自己写的命令,怎么搞?

我只知道内核源码包的某个目录下有一个后缀为“bash”的文件夹,这个文件夹的内容在内核编译好后,就是bash进程的所对应的可执行程序
bash进程就是终端运行时的进程。
我知道这个进程中有一个函数明教readline,他接受命令行参数为其参数,并根据参数值调用相应进程,已完成这个命令的功能,如:
ls -l
我现在想知道,怎样找到某个命令所对应的进程,即对应的可执行程序

这就是我的问题。

另外,正规的linux在打开终端时,首先并未运行终端对应的bash进程,还是一个登陆界面,要求输入用户名和密码。这个登陆界面对应的进程又是什么,怎么知道它是内核源代码中的哪个部分编译而来。

你提到的需求都是些应用层次的,没有修改内核的必要,无非是限制权限等等。

只需要自己去用root用户整理下文件设置下权限~

“去掉某些linux固有的shell命令“,你直接把你不想用户执行的命令给弄到普通用户看不到而root可以看到的路径中去就好了,比如挪到/sbin或者/usr/sbin下,并且去掉普通用户的可执行权限和文件的s标志,而且禁止普通用户对sbin或者/usr/sbin目录的访问(防止拷贝)~

“增加一些自己写的命令“,道理如上,你把你增加的命令放到普通用户的系统路径就可以了~

PS:“怎样找到某个命令所对应的进程,即对应的可执行程序”(这个说法有点问题呢~~~),还是如上,在bash在执行一个命令时,首先判断是否是内建命令(这种命令是没有可执行文件的),或者是否存在于当前环境变量路径中(/bin或者/usr/bin或者/usr/local/bin或者/opt/bin等等),或者是否指定了路径。追问

我们设计的系统不能用linux的固有shell命令(应该说shell命令的绝大多数“必须”去除),不管对普通用户,还是超级用户,甚至是最原始的admin用户。
你说:“增加一些自己写的命令“,道理如上,你把你增加的命令放到普通用户的系统路径就可以了~
比如我自己写了个命令"xianshi"模拟shell的"ls"功能,我把实现写出来了,也放在你说的/sbin下,但是我在命令行敲入“xianshi -l”,系统怎么知道要去调用我写的那个实现呢?

追答

我简单说下:shell在执行一个命令时,先判断其类型,若是内建命令(等于是shell可以识别的“口令”),则表明它是shell自己实现的,那就需要调用外部命令,如果不是,就表明需要需要调用外部命令,则此时需要去在系统路径中查找对应的文件,如果找到了就传递参数并执行它,找不到就会提示command not found~
你需要做的就是去实现一些必要的工具,比如一个shell环境,(bash,zsh,csh等都是),和一些必要的命令(保证一些系统基本服务的启动,比如ifconfig这样的)。

我不准备回答你最后一个问题,你搞明白我上面说的就知道答案了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-02
bash shell没几个内建命令。shell命令其实就是调用别的程序而已。
你这么问说明你才接触linux。ls 属于coreutils包中的,你不安装,基本上什么都没有。bash也不属于内核。
第2个回答  2012-03-02
第一个问题.你可以用busybox编译你要用的命令.就像编译内核一样选择需要用的功能.嵌入式系统比较常用的编译方法
第二个问题.不是很理解意思
第三个问题,登录进程就是login进程.源码不清楚
第3个回答  2012-03-01
用ps aux|grep bash。
bash 只是一个Shell
find /bin -name login追问

我只所以要问linux登录时,登录页面所运行的进程,是因为我想了解他的机制。因为我们要求不用linux原来的那套登录机制,而自己重新改写,并换上新的加密机制来进行密码的传输和存储。
ps aux|grep bash
我敲这个命令干啥啊,难道我不知道是bash进程在起作用吗
find /bin -name login
我找他干啥啊,找到他又不知道为什么登录界面和他关联,其实现又是什么!
我们是做一个系统,我做其中的一个模块,你三行回答就了事!高!

第4个回答  2012-03-29
系统从启动后第一个内核功能是init()进程 , init() 会调用login() 进程, login() 验证成功了会调用一个指定的shell, 你要是写登陆程序需要替换的是login程序, 和shell 没有直接关系

除了init() 进程, 所有的进程都是从init() 派生出来的, 通过fork() 创建子进程,你的xianshi 是shell 通过fork() 调用的,然后用exec() 执行外部命令, 也许你是想问这点吧
相似回答
大家正在搜