java有没有办法找到真正的UID而不是linux中的有效UID?

Posted

技术标签:

【中文标题】java有没有办法找到真正的UID而不是linux中的有效UID?【英文标题】:Is there a way in java to find the real UID rather than the effective UID in linux? 【发布时间】:2016-02-25 21:07:00 【问题描述】:

如果我以 sudo 用户身份运行 java 类文件,则有效用户 ID 将更改为 sudo 用户。我可以使用System.getProperty("user.name") 获得有效的用户标识。但是,有什么方法可以从 java 程序中获取真正的用户 ID?变量 $SUDO_USER 在 shell 中不是一个可靠的变量。

【问题讨论】:

不,你不能;这将需要访问 Java 无法访问的操作系统级原语,即使这样,它也会询问 API 在 Java 可以运行的其他操作系统上的兼容性问题(例如,Windows 没有这样的概念) . @fge:有各种操作系统级原语的 Java API;我不能直接说,肯定没有提供这个的,你可以吗?另外:Windows 具有模拟功能,这将呈现与上述类似的场景,因此可能包含在任何此类抽象 API 中。 @T.J.Crowder 我从来没有说过理论上不可能;只是现在没有。我的评论仍然成立。 Windows 的模拟与 getuid() 与 geteuid() 不同。 如果有linux命令,那么可以使用Runtime.getRuntime().exec(),然后通过从命令中获取inputstream来解析输出。 @SourabhBhat:非常正确和好点,如果您可以合理地假设该命令没有以某种方式被破坏。 【参考方案1】:

是的,只需使用getuid(2) 系统调用,而不是geteuid(2) 系统调用。当您执行具有可执行权限(可执行文件,而不是 shell 脚本)和 setuid 位的文件时,exec(2) 系统调用会更改有效的 uid(有关该位的说明,请参见 chmod(2)

一旦你执行了一个设置了 setuid 位的文件,你将拥有你的登录用户 id 作为真实使用的 id,有效的用户 id 将是文件所属的用户和你(作为普通用户) , 而不是 root) 只能通过 seteuid(2) 系统调用在真实和有效的用户 ID 之间进行更改。普通用户不允许进行更多更改。超级用户可以通过setuid(2) 系统调用来更改两者。

【讨论】:

以上是关于java有没有办法找到真正的UID而不是linux中的有效UID?的主要内容,如果未能解决你的问题,请参考以下文章

linux[基础]-20-用户与文件权限-[文件特殊权限]-[01]

有没有办法在下面的代码中找到文本而不是Key

有没有办法做 gsp 部分而不是标签库?

linux 文件IO操作中,用read函数读取文件,有没有办法每次只读取一行,而不是读取指定的字节数?

有没有办法强制 apache 返回 404 而不是 403?

有没有办法让 AuthorizeAttribute 响应状态码 403 Forbidden 而不是重定向?