LINUX对shell命令的拦截

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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脚本语言里需要执行的命令啊 这个需要脚本解析器解析出来的

楼主,shell 接收到一个 非内部命令 (如 ls, find)时,不是把命令提交给内核的,这个概念是错误的。 shell 应该是 fork 出一个进程,这个子进程调用 exec* 系列系统调用 (比如 execlp 等)来载入ls, find等可执行程序执行, 而此时的shell进程本身会 通过 wait 系统调用等待子进程完成。

由上可见,一个进行拦截的地方可以放在 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 同楼上,哈哈,你要是实在想要就键盘记录。。。

shell从入门到精通(10)信号捕获和处理

前言

Linux利用信号与运行在系统中的进程进行通信。当你在终端中启动一个前台进程,按下(Ctrl +C),Linux内核会生成SIGINT信号中断该进程。而trap命令可以在信号出现时捕获,修改信号的默认处理动作。

捕获信号

trap命令允许你来指定shell脚本要监听并从shell中拦截的Linux信号。如果在脚本收到了trap命令中列出的信号,该信号不再由shell处理,而是交给本地处理。

trap命令格式:

trap command signals-list

signals-list表示要捕获的信号列表,多个信号以空格隔开,command表示收到信号后执行的命令。

下面通过一个例子,展示如何用trap命令来忽略SIGINT信号,并控制脚本的行为:

#!/bin/bash

#测试信号捕获

trap "echo \' Sorry! I have trapped Ctrl-C\'" SIGINT

echo &#

以上是关于LINUX对shell命令的拦截的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell命令讲解

linux命令和shell命令有啥区别啊?

linux shell脚本执行命令详解

linux shell 命令定义和使用数组出错

利用shell命令实现Eeclipse对Android的远程调试

shell从入门到精通(10)信号捕获和处理