【发布时间】:2010-09-25 17:23:23
【问题描述】:
有没有办法记录(/var/log)用户在 Unix shell 中执行的命令?
【问题讨论】:
-
@dmckee:
*nix是什么?一种引用 Unix 的方式?还有什么?
有没有办法记录(/var/log)用户在 Unix shell 中执行的命令?
【问题讨论】:
*nix 是什么?一种引用 Unix 的方式?还有什么?
假设您这样做是出于安全目的,请查看流程记帐。您没有说您使用的是哪个 UNIX 变体,但对于 Linux,请查看 http://www.gnu.org/software/acct/ 请注意,您将生成大量数据,因为进程记帐会写入有关在系统范围内运行的每个命令的数据(它是内核功能) .您的发行版可能已经有实用程序;在 Debian 中检查 'acct' 包。
如果您只是想记录您所做的事情,以便稍后返回并查看它,脚本(如在另一个答案中)或屏幕(使用 -L)将提供更好的解决方案。但是,它们不适用于安全审计,因为绕过它们很简单:只需运行一个 shell 脚本。此外,行编辑会使文件变得一团糟。诅咒应用(比如文本编辑器)更糟糕。
此外,如果您强迫您的用户通过例如脚本,您最终可能会捕获信息(例如,电子邮件),您拦截这些信息可能是非法的。
【讨论】:
进程记帐是要走的路,尽管它会占用大量磁盘空间。除非你有一个非常笨拙的盒子,否则我不会让它继续运行,但它对于解决问题非常有用,因为它基本上跟踪每个进程,声称更简单的“ps 快照”工具无法匹配。
你基本上用accton /var/account/pacct打开它,然后内核写入退出的每个进程的详细信息,包括:
还有一些其他的东西。
你用一个赤裸裸的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)返回的值。
【讨论】:
我脑子里冒出一个愚蠢的想法:
script 会将会话复制到文件中。您可以将其发送到正在由日志记录进程读取的命名管道——唯一的事情是,您将获得输出以及命令。
【讨论】: