BigBrother
链接:https://github.com/hhr346/BigBrother
突然的一个想法,然后就花了一晚上实施了一下,具体逻辑是通过直接调用Linux服务器上的命令,在服务器上统计各个用户的活动数据,分为登录次数、登陆时间和进程活动次数。
具体的实施的三个部分逻辑都很相似,挑一个在线时长来进行具体说明:
output = subprocess.check_output(['last'])
# Extract usernames and time spent, return a list
lines = output.decode().split('\n')
users = [line.split()[0] for line in lines[:-3] if line]
time_last = [line.split()[9] for line in lines[:-3] if line]
首先是用last
命令来提取输出,并且分析出用户名和在线时长。
这里的截取范围是去除了最后三行,因为
last
的输出的最后三行有点问题
可以看到这里自动就已经有了在线时长了,所以我们只提取最后括号里的数值(不过这也提示我们可以做一个用户的活跃时间段的分布)
digits = [re.findall(r"\d+", i) for i in time_last]
index = np.array(np.where([len(digit)==2 for digit in digits]))[0].tolist()
users = [users[i] for i in index]
time_slots = [timedelta(hours=int(digits[i][0]), minutes=int(digits[i][1])) for i in index]
之后我们就通过正则表达式将小时和分钟提取出来(这里可能有点问题,如果单次在线时长大于24个小时的话,显示的格式是不一样的,之后更改一下)
最后将每个用户对应的在线时长进行累加,并排序后输出结果。
# Do the sum
print(len(users), len(time_slots))
slot_total = {}
for user, time_slot in zip(users, time_slots):
#print(f'{user:10} %10s' %time_slot)
if user in slot_total:
slot_total[user] += time_slot
else:
slot_total[user] = time_slot
# Do the sorting
slot_total = sorted(slot_total.items(), key=operator.itemgetter(1), reverse=True)
# 这将返回一个字典对象,其中键是用户名,值是对应的活动次数。
user_activity = Counter(users)
login_total = sorted(user_activity.items(), key=operator.itemgetter(1), reverse=True)
目前可能的问题是这三个指标都各有缺陷,不能完全的反映用户实际的参与度,比如登录次数对喜欢开多个终端的用户来说就比较利好;在线时间也只能说明是一直挂着的,而不能说明太多;进程活动数则忽略了不同进程之间的差异性。 标签:slot,users,必备,Linux,user,time,服务器,line,total From: https://www.cnblogs.com/hhr346/p/17732245.html