如何更新正在运行的进程的用户/组设置?

Rus*_*lan 5 process users group privileges

假设我更改了一些用户设置,例如其初始登录组或将其添加到新组。我现在可以su user使用这些新设置。但是所有以前运行的进程仍将具有与以前相同的权限。

如何强制特定运行的进程重新读取/etc/passwd/etc/group重新初始化其用户和组设置,而不终止它正在执行的任何活动?我试过用gdb和 do附加到进程print setuid(MY_USER_ID),但尽管结果是0(即成功),进程仍然保持相同的数据(检查bash运行groups以查看是否出现了额外的组)。

yae*_*shi 2

非常有趣的尝试。实际上,进程的补充组(在 中定义/etc/group)是通过setgroups系统调用设置的。它需要CAP_SETGID特权或 root。

所以你可以这样做:

# id
uid=0(root) gid=0(root) groups=0(root)

# gdb -q id
Reading symbols from id...(no debugging symbols found)...done.
(gdb) b getgroups
Breakpoint 1 at 0x401990
(gdb) run
Starting program: /usr/bin/id 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, getgroups () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call setgroups(5, {1, 2, 3, 4, 5})
$1 = 0
(gdb) d 1
(gdb) c
Continuing.
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),5(tty)
[Inferior 1 (process 8059) exited normally]
(gdb) 
Run Code Online (Sandbox Code Playgroud)