仅更改Linux中一个线程的UID / GID

时间:2009-08-03 17:36:11

标签: linux pthreads setuid

有没有办法只在多线程进程中更改一个线程的UID / GID?

这样做的原因是编写一个文件服务应用程序 - 除非调用者的uid / gid设置为正确的用户,否则不会强制执行A​​CL和配额,新的文件/目录不会使用正确的uid / gid等创建。

网络应用程序通常可以在开头fork()并在单独的进程中处理每个用户请求。如果需要共享数据,则必须通过某种共享内存。但是,例如默认情况下,FUSE(linux用户文件系统)使用多线程并与python绑定结合使用,尝试使用分叉模型是不切实际的。

整个过程的“一致”UID似乎是根据POSIX标准,但旧的Linux不遵循POSIX并允许不同的uid用于不同的线程。新内核似乎遵循POSIX,是否有某种方法允许旧的“破坏”行为?

2 个答案:

答案 0 :(得分:7)

特定于Linux的setfsuid() / setfsgid()是每个线程而不是每个进程。它们专为此用例(文件服务器)而设计。

请注意,access()仍将使用真实的uid和gid检查访问权限 - 这是设计的(如果运行此二进制文件的用户具有对此的指定访问权限,则会回答问题文件“的)。对于setfsuid() / setfsgid()情况,您应该尝试所请求的操作,并检测由于此时缺少权限而导致的失败。

答案 1 :(得分:6)

要仅为一个线程更改uid,您需要直接使用syscall:syscall(SYS_setresuid,...); libc函数setresuid()将为所有线程同步它(使用它发送给所有线程的singal)!