linux - 如何在内核中获取当前用户,即如何以正确的方式调用 current->uid

标签 linux linux-kernel kernel procfs

我正在编写可加载内核模块 (LKM)。如果刚刚执行 cat/proc/的用户是当前用户,则此 LKM 需要做一些特殊的事情。所以我想弄清楚如何找到这些信息。我的第一次尝试是使用 cred.h 中定义的 get_current_user()。但这是行不通的。 http://lxr.linux.no/linux+*/include/linux/cred.h#L290我没有寻找其他方法,这就是我发现似乎没有任何效果的方法 How to get userID when writing Linux kernel module How do I call Linux syscall from kernel space?

有问题的功能:

static int  getuid()
{
 return get_current_user()->uid;
}

gcc 输出:

make -C /lib/modules/2.6.32-358.11.1.el6.x86_64/build M=/root/git_prj1 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
  CC [M]  /root/git_prj1/proc_setup.o
/root/git_prj1/proc_setup.c:37: warning: function declaration isn���t a prototype
/root/git_prj1/proc_setup.c: In function ���getuid���:
/root/git_prj1/proc_setup.c:39: error: dereferencing pointer to incomplete type
/root/git_prj1/proc_setup.c:39: error: implicit declaration of function ���get_uid���
/root/git_prj1/proc_setup.c:39: warning: assignment makes pointer from integer without a cast
/root/git_prj1/proc_setup.c:39: warning: return makes integer from pointer without a cast
/root/git_prj1/proc_setup.c: In function ���read_key���:
/root/git_prj1/proc_setup.c:52: warning: format ���%s��� expects type ���char *���, but argument 4 has type ���int���
make[2]: *** [/root/git_prj1/proc_setup.o] Error 1
make[1]: *** [_module_/root/git_prj1] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
make: *** [all] Error 2

最佳答案

由于我看不到您的代码的完整源代码,所以我无法确切地说出哪里出了问题。

不过,我写了一个快速演示并设法让它相当容易地工作。我怀疑您只是在您拥有的任何代码中缺少一个 header 。

danieltang@danieltang-virtual-machine:~/test_module$ cat test.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/cred.h>

static int test_init(void)
{
    printk(KERN_INFO "Current UID = %u\n",
        get_current_user()->uid);

    return 0;
}

static void test_exit(void)
{
}

module_init(test_init);
module_exit(test_exit);
danieltang@danieltang-virtual-machine:~/test_module$ make
make -C /lib/modules/3.5.0-17-generic/build  M=/home/danieltang/test_module   modules  
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
Building with KERNELRELEASE = 3.5.0-17-generic
  Building modules, stage 2.
Building with KERNELRELEASE = 3.5.0-17-generic
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
danieltang@danieltang-virtual-machine:~/test_module$ sudo insmod test.ko
danieltang@danieltang-virtual-machine:~/test_module$ dmesg | tail -n1
[ 3705.237507] Current UID = 0
danieltang@danieltang-virtual-machine:~/test_module$ 

关于linux - 如何在内核中获取当前用户,即如何以正确的方式调用 current->uid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950481/

相关文章:

linux - 我怎么知道编译内核代码时是否有错误?

c++ - 全屏小部件

linux - 海绵和T恤的区别

linux - 结束内核 panic - 不同步 : attempted to kill init! exitcode = 0x00007f00

在内核中调用 do_fork

linux - linux 提供的 cmpxchg 调用是否会崩溃?

linux - 如何创建新的 Sqlite 元命令

Linux - 通用网络配置

linux - 如何使用 vm_operations 结构来拦截特定页面集的页面错误?

linux - Netlink 套接字,libnl - - nl_recvmsgs_default 返回 -22