Linux下如何实现runas功能?切换用户后进程无法访问/dev/input文件怎么办?
问题原因
- 核心问题出在你只配置了进程的主用户ID和主组ID,没有初始化进程的附加组列表:
setresgid仅会修改进程的真实、有效、保存设置这三个主组ID,不会自动加载目标用户所属的全部附加组。你遇到的/dev/input/event*文件权限要求归属input组的用户可读写,而input是目标用户的附加组而非主组,进程的附加组列表中没有input组的ID,所以触发权限拒绝。 - 次要排查方向:如果确认附加组配置正确仍有问题,可检查SELinux安全策略是否限制了进程对输入设备的访问权限。
解决方案
- 在调用
setresgid、setresuid之前,先调用initgroups接口加载目标用户的所有附加组,示例代码如下:
#include <pwd.h> #include <grp.h> #include <sys/types.h> #include <unistd.h> // 替换为你的目标用户名 const char* target_user = "testuser"; // 获取目标用户的信息 struct passwd* pw = getpwnam(target_user); if (pw == NULL) { perror("getpwnam failed"); exit(EXIT_FAILURE); } // 加载目标用户的所有附加组,第二个参数传入用户主组ID if (initgroups(pw->pw_name, pw->pw_gid) != 0) { perror("initgroups failed"); exit(EXIT_FAILURE); } // 再依次设置组ID、用户ID if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0) { perror("setresgid failed"); exit(EXIT_FAILURE); } if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0) { perror("setresuid failed"); exit(EXIT_FAILURE); } // 最后执行execvpe启动目标进程
- 若为SELinux限制导致,可先临时关闭SELinux验证:
执行setenforce 0后重试访问,若正常则需根据进程的SELinux上下文配置对应的设备访问规则。
内容的提问来源于stack exchange,提问作者Soonts
相关产品推荐
相关产品推荐

