mylast 通过utmp读取服务器登录情况

简介: 最近突然要清理闲置服务器,最简单的指标当然是看下有多少服务器是最近没有人登录过的。当登录服务器的时候,init, tty等会将登录和登出信息记录到/var/log/wtmp文件中,通过last命令可以查询服务器的登录情况。 但是直接到服务器上执行last命令有几个问题,一是希望查询一个时间段内的登

最近突然要清理闲置服务器,最简单的指标当然是看下有多少服务器是最近没有人登录过的。当登录服务器的时候,init, tty等会将登录和登出信息记录到/var/log/wtmp文件中,通过last命令可以查询服务器的登录情况。
但是直接到服务器上执行last命令有几个问题,一是希望查询一个时间段内的登录情况,而last命令的-t参数只能设置最近时间点;另一个是服务器上的last比较老,不支持-F参数,显示的事件没有年字段,计算的时候可能会存在问题。

最方便的解决方法当然是自己来读取wtmp文件了。linux提供了utmp.h头文件,里面包含了utmp数据结构和操作函数。关于utmp这个结构,可以通过man utmp进行查询。其中比较常用的几个属性有:ut_type(登录/登出类型,具体上面手册中有详细的宏定义说明)、ut_tv(操作的事件)、ut_user(操作用户)、ut_host(操作主机名/ip)。
手册中强调了,登录和登出都会单独记录一条,唯一的区别是登出不记录ut_user等字段,所以估计last命令中每次登录的事件计算,应该是根据每次登录和之后的一次登出的ut_line匹配上进行计算的。

再来说下utmp的操作函数,主要操作流程为:setutent -> getutent -> endutent,感觉和文件读写顺序差不多。首先需要通过setutent重新定位到utmp的文件头,循环调用getutent获取每一次的utmp记录,最后通过endutent结束读取。从api可以看出,所有的记录都要顺序读出,然后再进行过滤和运算。

需求是在给定事件段内打印出最后一次登录的时间,所以不去判断那次登录是否有登出操作,大致的实现:
[cce lang=”c”]
time_t from = atol(argv[1]);
time_t to = atol(argv[2]);
struct utmp *line = NULL;
struct utmp *result = NULL;
time_t timestamp;
utmpname("/var/log/wtmp");
setutent();
while( (line = getutent()) != NULL) {
if (line->ut_type == USER_PROCESS ) {
timestamp = line->ut_tv.tv_sec;
if(timestamp >= from && timestamp <= to) {
if(result != NULL) {
free(result);
}
result = malloc(sizeof (*result));
memcpy (result, line, sizeof (*result));
}
}
}

if(result != NULL) {
timestamp = result->ut_tv.tv_sec;
printf("%s %s %s %s", result->ut_line, result->ut_user, result->ut_host, asctime(localtime(&timestamp)));
}
endutent();
[/cce]
获取的参数是两个时间段,为了方便运算,直接要求输入时间对应的unix时间戳,可以通过date命令获取。遍历所有记录,只读取USER_PROCESS类型的,然后比较这次登录时间是否在给定时间段内。因为这个顺序刚好是登录时间的顺序,所以最后一次登录的时间,就是最后一条符合if判断的时间。最后打印出来就OK了。


转载自:https://coolex.info/blog/326.html

目录
相关文章
|
2月前
|
SQL 弹性计算 分布式计算
ECS配置问题之免密登录失败如何解决
ECS配置指的是对阿里云Elastic Compute Service(弹性计算服务)实例的硬件和软件资源进行设置的过程;本合集将详述如何选择合适的ECS配置、调整资源配比以及优化实例性能,以满足不同应用场景的需求。
|
10月前
|
网络虚拟化 Docker 容器
本地docker不能登录远程harbor服务器,error response from daemon,error parsing http 403 response body
本地docker不能登录远程harbor服务器,error response from daemon,error parsing http 403 response body
136 0
本地docker不能登录远程harbor服务器,error response from daemon,error parsing http 403 response body
|
2月前
|
弹性计算 Windows
使用阿里云服务器登录雾锁王国后,游戏创建失败怎么办
使用阿里云服务器登录雾锁王国后,游戏创建失败时,请更新游戏并重启游戏进程。
282 3
|
1月前
|
安全 Linux 网络安全
购了轻服务器,手机登录服务器用root和administrator做登录名,都提示别名已存在,请修改
【2月更文挑战第16天】购了轻服务器,手机登录服务器用root和administrator做登录名,都提示别名已存在,请修改
13 1
|
2月前
|
安全 Linux 网络安全
手机登录服务器用root和administrator做登录名,都提示别名已存在
【2月更文挑战第5天】手机登录服务器用root和administrator做登录名,都提示别名已存在
30 8
|
6月前
|
安全 Linux 网络安全
百度搜索:蓝易云 ,Linux Debian11服务器安装SSH,创建新用户并允许SSH远程登录,及SSH安全登录配置!
这些步骤提供了在Debian 11服务器上安装SSH,创建新用户并允许SSH远程登录以及进行SSH安全登录配置的指南。请确保按照步骤操作,并根据您的需求进行必要的修改。
100 0
|
2月前
|
Web App开发 弹性计算
ECS续费问题之登录网站如何失败解决
ECS续费是指对已创建的阿里云ECS实例执行的续费操作,以延长其服务期限;本合集旨在为用户提供ECS续费的操作步骤、策略选择和注意事项,确保业务的持续性和成本的优化。
|
2月前
|
网络安全 数据安全/隐私保护
如何使用ssh key免密码登录服务器?
如何使用ssh key免密码登录服务器?
|
3月前
|
安全 Linux Shell
Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)
Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)
88 0
|
3月前
|
运维 Linux 测试技术
Linux Xshell配置public key实现免密登录linux服务器
Linux Xshell配置public key实现免密登录linux服务器
62 0