更改UID / GID在Linux中只有一个线程
题
有一种在多线程处理来改变仅一个线程UID / GID?
这样做的原因是写一个文件服务应用 - ACL的和配额不会强制执行,除非调用者的UID / GID被设置为正确的用户,新的文件/目录不正确的UID / GID等创建
在网络应用程序通常可以叉()本身在开始和过程在分开的处理每个用户请求。如果有需要共享数据,它必须通过某种共享内存。然而,例如所述保险丝(Linux用户文件系统)默认使用多线程和与Python绑定一起选择这将是不实际的尝试使用分叉模型。
有一个全过程的“一致” UID似乎按照POSIX标准是,但是老Linux版本没有按照POSIX并允许不同的线程不同的UID。新的内核似乎遵循POSIX,有一些方法,让旧的“破”的行为?
解决方案
在Linux特有setfsuid()
/ setfsgid()
是每个线程而不是每个进程。他们用于该用途的情况下(文件服务器)而设计的。
请注意access()
使用真正的UID和GID仍然会检查访问 - 这是由设计(它的目的是回答这个问题的“应该谁跑这个二进制文件的用户具有给定的访问此文件” )。对于setfsuid()
/ setfsgid()
情况下,你应该只是尝试请求的操作和检测故障是由于在这一点上缺少权限。
其他提示
要更改UID只有一个线程需要直接使用系统调用:系统调用(SYS_setresuid,...);的libc函数setresuid()将所有线程(使用它发送到的全部线程的葛)同步它!
不隶属于 StackOverflow