记录终端命令

时间:2008-12-07 04:58:03

标签: linux unix logging shell

有没有办法在Unix shell中记录用户执行的(/ var / log)命令?

3 个答案:

答案 0 :(得分:6)

假设您出于安全目的这样做,请查看流程会计。您没有说出您所使用的UNIX变体,但是对于Linux,请查看http://www.gnu.org/software/acct/请注意,您将生成大量数据,因为进程记帐会写入有关系统范围内每个命令的数据(其内核)特征)。你的发行版可能已经有了实用工具;在Debian中查看'acct'包。

如果您只是想记录您所做的事情,那么您可以稍后再回头查看,脚本(如在其他答案中)或屏幕(使用-L)将提供更好的解决方案。但是,它们不适用于安全审计,因为它可以绕过它们:只需运行shell脚本。此外,行编辑会使文件变得混乱。诅咒应用程序(比如文本编辑器)更糟糕。

另外,如果你强迫用户通过例如脚本,你可能会收集信息(例如,电子邮件),这可能是非法的拦截。

答案 1 :(得分:4)

进程会计是可行的方法,尽管它占用了大量的磁盘空间。这不是我要留下的东西,除非你有一个非常繁琐的盒子,但它对于解决问题非常有用,因为它基本上跟踪每个过程,声称更简单的“ps快照”工具无法匹配。

你基本上用accton /var/account/pacct打开它,然后内核会写出退出的每个进程的详细信息,包括:

  • 流程名称(不幸的是,不是args)。
  • 开始时间。
  • 已用时间。
  • 用户和系统CPU时间。
  • 退出代码。
  • 内存,I / O,故障和交换统计信息。
  • 进程ID。
  • 父进程ID。

以及其他一些事情。

你用赤裸的accton关闭它,所以所有那些嘲笑Windows使用Start按钮关闭的人,哈哈! : - )

可记录的记录有两种变体,v1和v3 - 确保您使用最新的流程会计软件和v3记录,因为它们包含更多有用的信息。 /usr/include/linux/acct.h文件显示了从那里可以获得的内容。

记录都是固定大小(无论版本如何),并且易于处理。

我们刚刚为我们的性能监控软件完成了一个Linux代理 - 我以为我会记下这个,但它仍然记忆犹新。

有一点需要注意的是comp_t字段 - 这些字段实际上是一个奇怪的指数/尾数类型,用于保存16位的大范围值 - 算法非常简单,可以将其转换为long:

comp_t ct = ?;
long val = (ct & 0x1fff) << (((ct >> 13) & 0x7) * 3);

另一件事是某些值是时钟刻度而不是秒,所以你必须除以sysconf (_SC_CLK_TCK)返回的值。

答案 2 :(得分:0)

我头脑中的愚蠢想法:

script会将会话复制到文件中。您可以将它发送到正在由日志记录过程读取的命名管道 - 唯一的是,您将获得输出以及命令。