一些 异常 用户试图移去系统上的所有活动记录(比如 ~/.bash_history), 不过我们可以运用专门的工具来监视所有用户执行的命令。推选运用进程记帐来记录用户的活动, 可以通过进程记帐查看每一个用户执行的命令, 包括CPU时间和内存占用。 Psacct程序提供了多个进程活动监视工具: ac, lastcomm, accton和sa。
◆ac命令显示用户连接时间的统计。
◆lastcomm命令显示系统执行的命令。
◆accton命令用于打开或关上进程记帐功能。
◆sa命令统计系统进程记帐的情况。
1). 安装psacct或acct软件包
如果你运用 RHEL, 运用 up2date命令:
# up2date psacct
如果你运用 CentOS/Fedora Core Linux, 运用 yum命令:
$ sudo apt-get install acct
或
# apt-get install acct
2). 启动psacct/acct服务
在Ubuntu/Debian Linux系统上, pacct可以自动启动。(安装包会在系统上建立一个/var/account/pacct文件)。但是在Red Hat/Fedora Core/Cent OS, 你须要手动启动psacct服务。敲入下面两个命令建立 /var/account/pacct文件和启动pacct服务:
# chkconfig psacct on
# /etc/init.d/psacct start
如果你运用 Suse Linux, 服务的名称为acct, 敲入下面的命令:
# chkconfig acct on
# /etc/init.d/acct start
现在我们可以了解如何运用这些工具来监视用户的命令和时间。
3). 显示用户连线时间的统计信息
命令可以根据登陆数/退出数在屏幕上打印出用户的连线时间( 单位为小时)。总计时间也可以打印出来。如果你执行没有任何参数的ac命令, 屏幕将会显示总计的连线时间:
$ ac
输出:
total 100.10
ac 命令从 /var/log/wtmp 文件中的登录和退出时间记录计算并输出用户的连接时间和总计连接时间,记帐文件 /var/log/wtmp 由 init 和 login 维护。ac 和 login 均不生成 /var/log/wtmp 文件。若记帐文件不存在,则不做记帐工作。
文件 /var/log/wtmp 可能很快就变得非常大,所以默认情况下 CentOS 在 /etc/logrotate.conf 中 配置了此文件的日志滚动。配置片段如下:
/var/log/wtmp {
monthly # 指定日志滚动周期为每月
create 0664 root utmp # 使用指定的文件模式创建新的日志文件
rotate 1 # 只保留一个滚动日志备份,即只保留 /var/log/wtmp.1
}
ac常用参数:
-d : 为每天输出一个总计时间。
-p : 为每个用户输出总计时间,并在最后追加一个所有用户的总计时间。
-a : 输出每天的记录,而不忽略没有登录活动的日子。
-y : 在显示日期时输出年份。
-z : 显示值为0的类别总计(除了全部总计)。默认禁止输出值为0的总计。
userlist : 显示指定用户的连接时间。多个用户之间用空格间隔,不允许有通配符。
显示每一天的连线统计时间:
$ ac -d
Nov 7 total 5.36
Nov 8 total 3.27
Nov 9 total 8.69
Nov 10 total 4.15
Nov 11 total 5.46
Nov 12 total 9.37
显示每一个用户的总计连线时间和所有用户总计连线时间:$ ac -p
editor 5.58
sqlbackup 6.62
root 7.10
.......
total 100.13
4). 查找用户过去执行的命令
可以运用lastcomm命令打印出用户过去执行的命令.
如,lastcomm root
也可以通过用户名, tty名或命令名来搜索以往执行的命令.
通过命令:lastcomm ls
通过tty:lastcomm pts/0
service root pts/0 0.00 secs Sun Nov 22 14:22
psacct root pts/0 0.00 secs Sun Nov 22 14:22
touch root pts/0 0.00 secs Sun Nov 22 14:22
注意如果,lastcomm命令没有输出,则说明linux的记账功能accton没有开启,accton用于打开或关闭进程记帐功能,它是运行lastcomm和sa命令的前提,可以使用如下的命令打开或关闭进程记帐功能,
# service psacct start
# service psacct stop
也可以查看其状态service psacct status
[root@ccidcom phpcode]# service psacct status
Process accounting is enabled.
则表明打开,如果显示disabled则说明没有开启,那么lastcomm命令将什么也不会显示,为避免进程记帐日志文件过大,通常在使用进程记帐功能时才打开,不用时就将其
关闭。
默认情况下,psacct 服务没有打开。若想在系统启动时就打开进程记帐功能,
请执行如下命令:
chkconfig acct on
lastcomm 输出字段说明
1.命令名
2.当命令执行时记帐设备收集的标志:
S �C 命令由超级用户执行
F �C 命令由 fork 产生,但是没有 exec (执行)
D �C 命令终止并生成一个core(核心)文件
X �C 命令被 SIGTERM 信号终止
3.运行进程的用户名
4.运行进程的终端
5.这个进程用的 CPU 时间
6.进程开始的时间
5). 统计记帐信息
可以运用
sa。sa命令打印过去执行命令的统计信息。另外, sa命令保存了一个叫做savacct文件, 文件包含了命令被调用的次数和资源运用的次数。而且sa还提供每一个用户的统计信息, 这些信息保存在一个叫做usracct的文件当中。
sa命令从 /var/account/pacct 原始记帐数据文件中读取信息并进行信息汇总
sa 命令的显示结果可以包含以下字段:
1. calls �C 命令的调用次数。
2. 记帐设备收集的信息:
re �C 实际使用时间(单位为分钟)。
cpu �C 通常简写为 cp,表示用户和系统时间之和(单位为分钟)。
k �C 平均 CPU 时间(单元的大小为1K)。
u �C 用户 CPU 时间(单位为分钟)。
s �C 系统 CPU 时间(单位为分钟)。
3. command �C 调用的命令。
不带任何参数的 sa 命令,将显示 calls、re、cpu、k 和 command 字段,以 CPU 字段排序。并将只用过一次的命令放在 ***other
类别中显示。
例如:
4 0.36re 0.12cp 31156k up2date
◆4表示调用了4次
◆0.36re "实际时间" 单位为分钟
◆0.12cp 系统和用户时间总数(CPU时间, 单位为分钟)。
◆31156K 核心运用所占的平均CPU时间, 一个单元的大小为1KB。 ◆up2date 命令名。
显示每一个用户执行的每个命令的信息:# sa -u
root 0.00 cpu 793k mem accton
root 0.00 cpu 956k mem initlog
显示每个用户执行命令的汇总信息
# sa -m
1369 3870.85re 0.79cp 775k
root 1091 3693.33re 0.77cp 746k
osmond 224 177.00re 0.02cp 928k
crq 54 0.52re 0.00cp 724k
可以通过查看 re, k, cp/cpu 等字段的值找出可疑的活动。
例如: 某个用户或某个命令占用了所有的CPU时间
如果某个命令的 CPU 时间和内存使用在不断增加,说明命令存在问题。
按平均 CPU 时间排序
# sa -k
1363 3870.85re 0.79cp 776k
10 0.02re 0.00cp 2221k rpmq
12 12.28re 0.00cp 2008k sendmail
12 0.01re 0.00cp 1465k troff
170 13.12re 0.02cp 1318k crond*
-b、-k、-n 和 �Csort-real-time 参数确定如何进行输出排序。
如果在命令行中指定了不止一个排序参数,则只有最后那个参数生效。
sa [ 参数 ]常用参数:
-a : 显示所有命令的名称(包括那些带有不可打印字符的和只用过一次的命令)。
-c : 同时显示百分比字段。
-l : 将 CPU 时间字段拆分为系统时间和用户时间两个字段显示。
-t : 同时显示实际使用时间与 CPU 总时间之比,即 re/cp。
-u : 忽略所有其它参数并显示每个命令执行时的 CPU 时间。
-m : 显示每个用户的汇总信息。
�Csort-real-time : 将输出按实际使用时间进行排序。
-b : 将输出按用户和系统时间的总和除以调用次数来进行排序,即 cp/calls。
-k : 将输出按平均 CPU 时间进行排序。
-n : 将输出按命令的调用次数进行排序。
-r : 将输出按逆序排列,可与其他排序参数一起使用