我们使用一个共享主机的时候,我们可以能记录每一个日志的登录时间,按照登录时间进行分级,并生成一个包含等级,用户名,第一次登录时间和最后一次登录时间,登录次数,总时长的细节报告

保存用户的登录信息的文件在

/var/log/wtmp中

#!/bin/bash

用户名 active_users.sh

log=/var/log/wtmp

if [[ -n $1 ]];

then

log=$1

fi

printf “%-4s %-10s %10s %-6s %-8s\n” “Rank” “User” “Start” “Logins” “Usage hours”

last -f $log | head -n -2 > /tmp/ulog.$$

cat /tmp/ulog.$$ | cut -d ‘ ‘ -f1 | sort | uniq > /tmp/users.$$

(

while read user;

do

grep ^$user /tmp/ulog.$$ > /tmp/user.$$ > /tmp/user.$$

seconds=0

while read t

do

s=$(date -d $t +%s 2 > /dev/null)

let seconds=seconds+s

done < < (cat /tmp/user.$$ | awk ‘ {print $NF }’ | tr -d ‘)(‘)

firstlog=$(tail -n 1 /tmp/user.$$ |awk ‘{ print $5 $6 }’ )

nlogin=$(cat /tmp/user.$$ | wc -l)

hours=$(echo “secounds / 60.0 ” |bc)

printf “%-10s %10s %-6s %-8s\n” $user “$firstlog” $nlogins $hours

done< /tmp/users.$$

) | sort -nrk 4 |awk ‘ {printf(“%-4s %s\n”,NR,$0) }’

rm /tmp/users.$$ /tmp/user.$$ /tmp/ulog.$$

其原理在于

我们需要使用日志文件wtmp,配合last -f命令获得其内容,

1.文件的第一行是用户名,我们提取出来了,并完成了去重操作,然后重新写入

2.然后循环遍历这个用户,我们使用grep来找出对应的日志行,并先写入对应的文件

3.然后读取这个文件,进行循环,我们找到每一行的事件,进行累加,这一步利用了awk

4.然后记性排序,获得第一行,之后,获取到时间

5.登录的次数是日志的行数

5.最后根据第4行进行排序,这样是根据使用时间排序,传给了awk,awk的命令为每一行都添加上了行号,行号就是每一个用户的等级

发表评论

邮箱地址不会被公开。 必填项已用*标注