You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何实现runas功能?切换用户后进程无法访问/dev/input文件怎么办?

问题原因
  • 核心问题出在你只配置了进程的主用户ID和主组ID,没有初始化进程的附加组列表:
    setresgid仅会修改进程的真实、有效、保存设置这三个主组ID,不会自动加载目标用户所属的全部附加组。你遇到的/dev/input/event*文件权限要求归属input组的用户可读写,而input是目标用户的附加组而非主组,进程的附加组列表中没有input组的ID,所以触发权限拒绝。
  • 次要排查方向:如果确认附加组配置正确仍有问题,可检查SELinux安全策略是否限制了进程对输入设备的访问权限。
解决方案
  1. 在调用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启动目标进程
  1. 若为SELinux限制导致,可先临时关闭SELinux验证:
    执行setenforce 0后重试访问,若正常则需根据进程的SELinux上下文配置对应的设备访问规则。

内容的提问来源于stack exchange,提问作者Soonts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:27:03