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

在Linux中仅更改一个线程的UID/GID,linux,pthreads,setuid,Linux,Pthreads,Setuid,有没有办法在多线程进程中只更改一个线程的UID/GID 原因是编写文件服务应用程序-除非调用方的uid/gid设置为正确的用户,否则不会强制执行ACL和配额,并且不会使用正确的uid/gid创建新文件/目录等 网络应用程序通常可以在开始时自行fork()并在单独的进程中处理每个用户请求。如果需要共享数据,它必须经过某种共享内存。但是,例如FUSE(linux用户文件系统)默认使用多线程,并且与python绑定结合使用,因此尝试使用分叉模型是不切实际的 整个进程的“一致”UID似乎符合POSIX标

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

原因是编写文件服务应用程序-除非调用方的uid/gid设置为正确的用户,否则不会强制执行ACL和配额,并且不会使用正确的uid/gid创建新文件/目录等

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


整个进程的“一致”UID似乎符合POSIX标准,但是旧的Linuxes没有遵循POSIX,允许不同线程使用不同的UID。新内核似乎遵循POSIX,是否有某种方法允许旧的“坏”行为?

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


请注意,
access()
仍将使用真实的uid和gid检查访问权限-这是出于设计考虑(它旨在回答“运行此二进制文件的用户是否应该具有此文件的给定访问权限”的问题)。对于
setfsuid()
/
setfsgid()
情况,您只需尝试请求的操作,并检测到由于此时缺乏权限而导致的故障。

要仅更改一个线程的uid,您需要直接使用syscall:syscall(SYS\u setresuid,…);libc函数setresuid()将为所有线程同步它(使用它发送给所有线程的信号)

这是更好的-我已经检查,并意外地发现,他们真的是每线程。这可能是首选的方式。然而,我没有测试它的原因是,quota()和access()不起作用。其他东西也可以工作-这可能是Linux bug。是的,这听起来确实像个bug,因为sys_setfsuid()的内核代码中的注释特别提到了access()。@Ondrej,请发布代码(或链接),说明
fsuid
与其他UID/GID构造不同,是每个线程,而不是每个进程。还请指定您的内核和glibc版本,以及线程实现(NPTL、LinuxThreads、OndrejThreads等)。但是:quota()可以工作,但是在检查之前必须先删除一些功能(我认为是CAP_资源)。access()不起作用,根据POSIX,“不应该”起作用。在我看来,这似乎是POSIX中的一个bug(我发现的第二个bug),Linux中的任何人似乎都不想改变它:(