python struct 用法_Python下使用struct库解析utmp

今天介绍一种解析utmp文件获取系统中用户信息的方法。有关utmp的介绍可以看我之前的文章《utmp文件》。此方法是使用python实现,大致如下:

$ vi utmp.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import struct

UTMP_STRUCT = 'hi32s4s32s256shhIII4i20x'

UTMP_STRUCT_SIZE = struct.calcsize(UTMP_STRUCT)

with open("/var/run/utmp", 'rb') as fd:

while True:

bytes = fd.read(UTMP_STRUCT_SIZE)

if not bytes:

break

data=struct.unpack(UTMP_STRUCT, bytes)

#repr可以看出原始的数据内容

#print(repr(data))

#直接将unpack的tuple转换为字符串,字符串以‘\0’结尾,所以只保留\0前的内容

data = [(lambda s: str(s).split("\0", 1)[0])(item) for item in data]

print(data)

运行结果

$ python utmp.py

['2', '0', '~', '~~', 'reboot', '2.6.32-358.el6.x86_64', '0', '0', '0', '1559633400', '826864', '0', '0', '0', '0']

['1', '53', '~', '~~', 'runlevel', '2.6.32-358.el6.x86_64', '0', '0', '0', '1559633400', '845284', '0', '0', '0', '0']

['8', '3588', 'pts/0', 'ts/0', '', '', '0', '0', '0', '1561434852', '892300', '1023453376', '0', '0', '0']

['7', '27146', 'pts/1', 'ts/1', 'root', '127.0.0.10', '0', '0', '0', '1561944111', '653687', '1023453376', '0', '0', '0']

以上输出了四组数据,也就是四条用户信息。以最后一组数据为例,对应struct utmp的字段为:

类型:ut_type, ut_pid, ut_line, ut_id, ut_user, ut_host, _, _, _, tv_sec, tv_usec, ut_session, _, _, _

数据:['7', '27146', 'pts/1', 'ts/1', 'root', '127.0.0.10', '0', '0', '0', '1561944111', '653687', '1023453376', '0', '0', '0']

如果想知道系统中所有正在登录的终端,可以找第一个项为'7'(struct utmp中ut_type为USER_PROCESS宏定义)的数据项,其中第三个项保存的就是此终端的名字,如上面的数据可以看出pts/1是当前正在登录的终端。

代码中使用struct.calcsize计算出每条用户信息的大小,每次从文件中读出一条用户的信息,然后按照UTMP_STRUCT(hi32s4s32s256shhIII4i20x)格式进行转化。UTMP_STRUCT为struct utmp在struct中对应的格式。struct详细的对应格式可以查看:https://docs.python.org/2/library/struct.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的`struct`模块是用来处理C语言中的结构体数据类型的模块,它提供了一种方便的方式来将Python中的数据类型转换为C语言中的数据类型,或者将C语言中的数据类型转换为Python中的数据类型。 使用`struct`模块可以进行字节级别的操作,例如将一个整数转换为4个字节的二进制数据,或者将4个字节的二进制数据转换为一个整数。这在网络编程、文件读写等方面都有着广泛的应用。 `struct`模块中最常用的函数是`pack()`和`unpack()`函数。`pack()`函数用来将Python中的数据类型转换为C语言中的二进制数据,而`unpack()`函数则用来将C语言中的二进制数据转换为Python中的数据类型。 例如,下面的代码将一个整数转换为4个字节的二进制数据: ```python import struct num = 1234 data = struct.pack('i', num) print(data) # b'\xd2\x04\x00\x00' ``` 其中,`'i'`表示将整数转换为4个字节的二进制数据。可以看到,`pack()`函数返回的是一个二进制数据类型的字符串。 而下面的代码将4个字节的二进制数据转换为一个整数: ```python import struct data = b'\xd2\x04\x00\x00' num = struct.unpack('i', data)[0] print(num) # 1234 ``` 其中,`'[0]'`表示取出`unpack()`函数返回的元组中的第一个元素,即转换后的整数。 除了`'i'`之外,`struct`模块还支持其他的格式化字符,例如`'h'`表示将整数转换为2个字节的二进制数据,`'f'`表示将浮点数转换为4个字节的二进制数据等。具体的格式化字符可以参考Python官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值