【问题标题】:How to get username from Linux kernel space如何从 Linux 内核空间获取用户名
【发布时间】:2012-10-09 07:26:18
【问题描述】:

我正在进行一些 Linux 模块开发,将我限制为只能使用内核可用的库,并且我想获取与我的模块用户名交互的用户的用户名。又名他们的“whoami”。我的模块实际上是围绕系统调用...我可以从内核空间中的 current->pid 获取 pid。有没有办法,也许,使用 pid 来追踪 pid 所属的用户?还是其他更简单的方法?

谢谢

【问题讨论】:

  • task_struct 中有一些字段保存所有者信息(UID、GID、有效 UID、有效 GID 等),但仅作为数字 ID。 libc 提供的所有 ID/名称解析服务都在所谓的命名服务切换 (NSS) 中的用户空间中实现。据我所知,没有内核例程可以进行解析,因为内核仅适用于 ID(类似于它仅适用于数字 IP 地址的方式)

标签: linux module linux-kernel system-calls


【解决方案1】:

您可以使用filp_open 函数从内核打开/etc/passwd 文件。接下来您需要使用file_operations 来读取文件:

struct file * file = filp_open(...);
file->f_op->read(file, ...);

阅读文件内容可能有助于UID -> username的翻译。

【讨论】:

  • 这仅在用户名映射到/etc/passwd 时有效。但地图也可以来自 NIS、NIS+、LDAP 等。
  • @HristoIliev:当然。在那种情况下是没有办法的。 Netlink + uid2name 守护进程作为一种可能的解决方案。
  • 我用你的方法,但是我只能将passwd文件的一部分读入缓冲区
  • @Jianchen 这里没有心灵感应的人
猜你喜欢
  • 2012-05-17
  • 2010-10-04
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多