Answers:
这不是您解决问题的方式。一旦向用户授予外壳程序访问权限,即委托该用户执行他/她具有适当权限的任何操作。忘记命令日志,在任何Unix系统中执行命令的方法太多了。
例如,用户可以启动一个邮件客户端(pine
例如,记录的唯一命令是),在那里他选择“ Compose”来启动VI,然后从VI中启动他想要通过的任何命令:!cmd
。该命令不会记录在任何地方,从系统的角度来看,它就像VI调用的任何帮助程序一样,例如grep或sort。Shell记录的唯一命令是pine
。
看来您真正想要的是审计。启用审核子系统并使用审核包中的auditctl
命令和auditd
守护程序来控制记录的内容。有关更多信息,请参见auditctl(8)手册页。
注意,记录每个进程实例也可能不是最佳的。例如,./configure
用于软件包的简单操作(使用自动工具创建)在创建数千个过程实例化方面尤为明显。这将使审核日志泛滥成灾,以至于以后很难对其进行分析。
安装acct
软件包(软件包名称因发行版而异,也称为流程记帐)并使用lastcomm <username>
:
[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr sernin pts/2 0.00 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
tr sernin pts/2 0.02 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
fortune sernin pts/2 0.00 secs Fri Nov 12 12:02
xmodmap sernin pts/2 0.00 secs Fri Nov 12 12:02
xrdb sernin pts/2 0.00 secs Fri Nov 12 12:02
sh sernin pts/2 0.00 secs Fri Nov 12 12:02
cpp sernin pts/2 0.00 secs Fri Nov 12 12:02
您也可以按tty或命令名称搜索。与往常一样,man lastcomm
有关更多信息。
如果您愿意做一点C编程,则可以编写一个包装execve的库,并记录到syslog,然后dlopen包含真正的execve syscall的库来完成此操作。然后在/ etc / environment中,将LD_PRELOAD设置为您创建的库的路径。
您将要在此处进入循环时要小心,因此您可能只想记录某些二进制文件的执行程序,或排除其他二进制文件(如syslog)的日志。
还有sudosh(http://sudosh.sourceforge.net)将进行会话日志记录。您可以选择将其作为用户定义的外壳运行,也可以通过sudo运行。它也跟踪每个会话的时间,因此您可以重播该会话并观看它(包括编辑会话等)。