自定义脚本通过utmp读取Linux服务器登录信息

最近突然要清理闲置服务器,最简单的指标当然是看下有多少服务器是最近没有人登录过的。当登录服务器的时候,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可以看出,所有的记录都要顺序读出,然后再进行过滤和运算。

需求是在给定事件段内打印出最后一次登录的时间,所以不去判断那次登录是否有登出操作,大致的实现:

 代码如下 复制代码
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();

获取的参数是两个时间段,为了方便运算,直接要求输入时间对应的unix时间戳,可以通过date命令获取。遍历所有记录,只读取USER_PROCESS类型的,然后比较这次登录时间是否在给定时间段内。因为这个顺序刚好是登录时间的顺序,所以最后一次登录的时间,就是最后一条符合if判断的时间。最后打印出来就OK了。

时间: 2024-10-24 13:21:34

自定义脚本通过utmp读取Linux服务器登录信息的相关文章

Linux服务器登录后显示“-bash-3.2#”

环境变量的问题,用户登陆后确实是root权限,字符显示的问题可以用这两条命令解决: -bash-3.2# cp /etc/skel/.{bash_profile,bashrc} ~ -bash-3.2# source ~/.bashrc

阿里云使用Linux进行域名绑定和服务器登录有哪些问题

域名绑定 Tomcat服务绑定域名的方法 ECS Linux系统域名绑定host后ping测试不生效 Nginx绑定多个域名的方法 ECS Linux无法解析hosts里面绑定域名的排查方法 服务器登陆 ECS Linux无法远程连接的检查方法 ECS Linux远程ssh报错read: Connection reset by peer ECS Linux ssh连接服务器报错CONNECTION RESET by peer ECS Linux通过Xshell 配置密钥key免密码登录 ECS服

分享个简易版Linux服务器初始化Shell脚本

该Shell脚本主要用于新安装Linux服务器系统的初始化工作,包括关闭IPv6模块,关闭SELinux,让vim显示颜色,设置系统语言编码,优化系统服务,内核参数优化等   该Shell脚本主要用于新安装Linux服务器系统的初始化工作,具体包括: 关闭IPv6模块 关闭SELinux 让vim显示颜色 设置系统语言编码 优化系统服务 内核参数优化等. 可以根据自己的实际情况修改,可用于生产环境.原作者是NetSeek,本人做了部分修改. 复制代码 代码如下: #!/bin/sh # desc

分享个简易版Linux服务器初始化Shell脚本_linux shell

该Shell脚本主要用于新安装Linux服务器系统的初始化工作,具体包括: 关闭IPv6模块 关闭SELinux 让vim显示颜色 设置系统语言编码 优化系统服务 内核参数优化等. 可以根据自己的实际情况修改,可用于生产环境.原作者是NetSeek,本人做了部分修改. 复制代码 代码如下: #!/bin/sh # desc: lsm03624 modified by www.webnginx.com #-------------------cut begin-------------------

Linfo:实时显示你的Linux服务器运行状况

Linfo 是一个自由开源的跨平台的服务器统计 UI 或库,它可以显示大量的系统信息.Linfo 是可扩展的,通过 composer,很容易使用 PHP5 库以程序化方式获取来自 PHP 应用的丰富的系统统计数据.它有 Web UI 及其Ncurses CLI 视图,在 Linux.Windows.BSD.Darwin/Mac OSX.Solaris 和 Minix 系统上均可用. Linfo 显示的系统信息包括 CPU 类型/速度.服务器的体系结构.挂载点用量.硬盘/光纤/Flash 驱动器.

Linux服务器远程登录服务器go工具用法

背景 平时工作中总是需要登录到线上服务,以解决各种问题,比如: 远程登录线上日志机器查看PHP Error Log.Mysql Error Log等 登录QA的测试机检查代码是否正常发布.各项配置是否正确 登录个人开发机 但是公司服务器都是需要通过跳板机登录,每次登录线上机器都需要先到跳板机登录一下,再登录到目标机器,很繁琐,而且必须得记得住目标机器的IP或者机器名才能尽快登录上去,要不然还得一顿查... 所以弄了个小工具,实现快捷登录(其实是几年前写的一个小脚本,最近升级了一下),分享出来大家

《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——第1章 Linux服务器安全运维 1.1 账户和登录安全

第1章 Linux服务器安全运维 1.1 账户和登录安全 安全是IT行业一个老生常谈的话题了,最近的"棱镜门"事件折射出了很多安全问题,处理好信息安全问题已变得刻不容缓.因此作为一名运维人员,必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,才能修补任何潜在的威胁和漏洞. 账户安全是系统安全的第一道屏障,也是系统安全的核心,保障登录账户的安全,在一定程度上可以提高服务器的安全级别,本节重点介绍Linux系统登录账户的安全设置方法.1.1.1 删除特

使用Python实现对Linux服务器CPU内存网络的监控脚本

本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写.Python 是由 Guido van Rossum 开发的.可免费获得的.非常高级的解释型语言.其语法简单易懂,而其面向对象的语义功能强大(但又灵活).Python 可以广泛使用并具有高度的可移植性.本文 Linux 服务器是 Ubuntu 12.10, Python 版本 是 2.7 .如果是 Python 3.0 版本的语法上有一定的出入.另外这里笔者所说的 Python 是 CPython

linux下用expect脚本实现ssh 自动登陆服务器

又学了一个小招,使用 expect 脚本语言实现 ssh 自动连接到服务器,可以自动输入密码.因为每次使用 ssh root@xx.xx.xx.xx 连接服务器,都要手动输入一遍密码,有没有办法自动输入密码呢? 在网上搜索了一下,果然有办法,有一种脚本语言 expect ,它的作用就是能与交互式程序进行"可程序化"会话,比如自动输入密码,碰到"password"字符就会自动输入密码. 首先要安装 expect 脚本程序,不过在 Macbook 中自带了.比如 Cen