首页
/ psutil库在Linux系统中获取用户登录信息的bug解析

psutil库在Linux系统中获取用户登录信息的bug解析

2025-05-22 11:46:43作者:谭伦延

问题背景

psutil是一个跨平台的Python库,用于检索系统信息和进程管理。在Linux系统中,psutil.users()函数用于获取当前登录用户的信息。然而,在psutil 6.1.0版本中,该函数在处理远程登录用户时出现了一个bug,导致所有用户的host字段都被错误地设置为"localhost",而不是实际的远程IP地址。

问题分析

这个bug源于Linux平台特定代码中对字符串比较函数strcmp的错误使用。在Linux系统的用户信息处理代码中,原本的逻辑是:如果用户的host字段是":0"或":0.0"(表示本地X Window会话),则将其替换为"localhost";否则保留原始host值。

然而,代码中错误地使用了逻辑或运算符(||)来组合两个strcmp调用,而没有正确检查strcmp的返回值是否为0(表示字符串相等)。strcmp函数在字符串不相等时会返回非零值,因此原条件判断(strcmp || strcmp)实际上总是为真,导致所有host值都被替换为"localhost"。

技术细节

正确的实现应该使用:

if (strcmp(ut->ut_host, ":0") == 0 || strcmp(ut->ut_host, ":0.0") == 0)

而错误的实现是:

if (strcmp(ut->ut_host, ":0") || strcmp(ut->ut_host, ":0.0"))

这种错误会导致:

  1. 对于本地X会话(":0"或":0.0"),条件判断为真(符合预期)
  2. 对于其他任何host值(包括远程IP地址),条件判断也为真(不符合预期)

影响范围

这个bug影响了psutil 6.1.0版本中Linux平台上的users()函数行为。具体表现为:

  • 本地控制台登录:正确显示为"localhost"
  • 远程SSH登录:错误地显示为"localhost"而非实际IP地址
  • 其他远程登录方式:同样错误地显示为"localhost"

解决方案

该问题已在后续提交中被修复,修复方法是正确检查strcmp的返回值是否为0。修复后,psutil.users()能够正确区分本地会话和远程会话,为远程登录用户显示实际的IP地址而非"localhost"。

验证结果

修复后的测试结果如下:

  • 本地控制台会话(tty7):正确显示为"localhost"
  • 远程SSH会话(pts/1):正确显示远程IP地址(如"192.168.56.1")

总结

这个案例展示了C语言中字符串比较的常见陷阱,特别是strcmp函数返回值的使用。在系统编程中,正确处理这类基础函数对于保证系统工具的正确性至关重要。psutil作为广泛使用的系统工具库,及时修复这类bug有助于确保依赖它的应用程序能够获得准确的系统信息。

登录后查看全文
热门项目推荐
相关项目推荐