linux的系统调用和shell命令式一回事吗?请解释下
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux的系统调用和shell命令式一回事吗?请解释下相关的知识,希望对你有一定的参考价值。
系统调用是程序的事情shell是人机接口,是你输入命令的地。
这两个完全无关。
你在shell里面输入命令,shell会根据你的命令执行程序,
执行的程序有可能调用系统的功能。
但是执行系统功能的指令,并不一定是通过shell发出的,
通过shell发出的命令也不一定会执行系统调用。 参考技术A 系统调用,就是常说的system调用,用于执行shell命令。
格式如下:
system("shell指令")
一般是在C代码中进行调用。awk中使用的也是C语法,也可以有系统调用。
LINUX对shell命令的拦截
shell命令在输入后首先会查询该命令是否是shell的内部命令,如cd。 如果不是内部命令则提交给内核,内核再调用相应的应用程序,进而做系统调用如ls。
有什么方法或接口可以拦截到shell提交给内核时,所提交的执行命令行字符或程序名称(无论在内核里拦截还是在用户层拦截都可以)?
linux是否可以拦截bash进程的系统调用如execl之类的,在发生调用事件时获得或修改系统调用的参数等(类似win32中的hook)
希望资深人士解答。最好附上相关代码及简单注释。 急用。分不吝啬 好答案再追加.
2楼 bash也是至少是1号进程fork下来的,只要是用户层进程就肯定可以由内核来拦截。 你学到太浅,不要这么武断就下结论。 我现在找到了一个方法是在内核里写个模块拦截所有0x80软中断关联的系统调用,但是这样做确实太麻烦了 来找个更好的办法。
4楼 键盘记录是有缺点的,我们现在的系统就是这么实现的,模拟了一套telnet实现原理建立了一个子进程伪终端来接受子终端的标准输出回显以及拦截用户标准输入,但是这种方法有待改进的地方很多,如果说遇到VI编辑界面或者是遇到有人把拦截命令写到SHELL脚本里运行就会很麻烦的。不太智能。
6楼 帅哥啊怎么可能啊,先不谈别的,光一个shell脚本解析器,就够你喝几年的了呵呵,而拦截shell脚本中的命令是系统必须实现的功能之一。
我要解析SHELL脚本语言里需要执行的命令啊 这个需要脚本解析器解析出来的
由上可见,一个进行拦截的地方可以放在 exec 系列调用中,exec是实现在 glibc 里的,所以你只要下载 glibc (或者你们系统使用的 libc )的源码,在 exec 调用中加入你的拦截代码。 编译修改后的glibc,替换系统中的glibc即可。
另外要注意的是,除了shell,其他程序也可能使用 fork+exec 来执行某些命令,如果不想拦截这种情况,在拦截时需判断一下当前进程的父或祖进程,看看是否是shell进程。
最后,glibc实在是太重要了,是所有程序的基础,改动需小心。 参考技术A 我觉得最好的方法是写一个bash的壳,直接替换系统里的bash。在壳里做你的拦截和分发。只是不知道你的设计是否允许你这么做。
这种做法比在kernel里拦截方便多了。对script调用也有效。
不能做bash的壳,那就只有改bash了。看了下bash的源码,execute_cmd.c里下面的call flow应该符合你的需要吧。加点自己的代码就OK了。
execute_simple_command => execute_disk_command => shell_execve
我还能想到的就是改libc的库了。直接把execv的代码替换成自己的版本。不过这里麻烦的就是你还要搞清是bash调你的还是其他应用程序调你的。
0x80软中断?你面临的困难和改libc一样。而且这时你只有简陋的武器,还是在应用层改吧。 参考技术B shell作为操作系统的外壳,是不能进行拦截的 谢谢
----------------------------------------------------------------
这我还真的没听过过…只知道shell接收命令来调用,
你确定可以拦截? 参考技术C 估计得改 linux 内核源码了。。。。。。呵呵 参考技术D 同楼上,哈哈,你要是实在想要就键盘记录。。。
以上是关于linux的系统调用和shell命令式一回事吗?请解释下的主要内容,如果未能解决你的问题,请参考以下文章