有人问我当地LUG的邮件列表是否有任何学习在GNU / Linux系统上发布的最后命令的方法。
我想我们正在全系统的讨论最后的命令。 经过一段时间的推理,如果您将一组命令限制为使用交互式控制台的实际用户发出的命令,那么最后一个命令应该已经在命令历史logging中注册。
另一种思考这个问题的方法是询问如何判断在GNU / Linux上创build的最后一个处理是关于它是否仍在运行或者是否已经完成,哪些是父进程和其他相关信息。
我已经为Linux提供了一个软件包,可以帮助处理会计。
在我的Ubuntu 9.10系统上,我做了这个安装程序“acct”:
sudo apt-get install acct
然后需要创build一个空白的日志文件,你可以这样做:
sudo touch /var/log/pacct
之后,进程记帐需要被激活:
sudo /usr/sbin/accton /var/log/pacct
从这一点开始,进程与执行它们的用户以及相关的terminal一起logging下来。
该命令可以看到日志文件:
lastcomm -f /var/log/pacct
我仍然在看这个程序…但看起来像这有助于。
对于特定的用户(和shell):历史
对于当前进程:ps
那么系统宽泛,看起来相当复杂。 这样的系统意味着应该有一些过程来监视每个用户.bash_history。 然后,当更新中央数据库更新。 一旦完成,我们可以对从中央数据库中select的“历史”命令进行扩展。 不过不是一个坏主意。
如果您将以下内容添加到/ etc / sudoers文件中:
Defaults logfile=/var/log/sudolog
所有的sudo命令都会被logging下来。 这可能不是每个用户的命令,但是这应该列出可以修改系统的重要的命令,我猜测这就是你所追求的。
您不能简单地监视.bash_history,因为其他用户可能不会使用历史logging,也可能不会使用bash开始。
您可以使用监听来监视所有执行的命令。
如果你想要最新的正在运行的程序,那么使用/ proc中的信息,就像这样…
for i in $(ls -t /proc/* | egrep "[0-9]+"); do test -f $i/cmdline && cat $i/cmdline && break; done
它将在/ proc中查找基于数字的目录(pid),然后检查cmdline文件是否存在并将其打印出来(显然,只要进入循环,pipe道中的命令就会消失,因此它们的cmdline文件将不存在)