是的,有可能。你可以在这里看到一个例子:
https://github.com/kebernet/pretty/blob/master/src/main/java/com/reachcall/util/SetUID.java
下面是代码示例:
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
public static int setuid(int uid) {
if (Platform.isWindows()) {
return OK;
}
return CLibrary.INSTANCE.setuid(uid);
}
bmargulies 的回答不正确(或不完全正确)。UNIX 中的非 root 进程可以设置 uid 或 gid,如果它具有相应的功能:
http://man7.org/linux/man-pages/man7/capabilities.7.html
CAP_SETUID
- 对进程 UID 进行任意操作(setuid(2)、setreuid(2)、setresuid(2)、setfsuid(2));
由于从操作系统的角度来看,您的程序作为“java”进程运行,因此必须为 java 可执行文件本身启用此 setguid 功能:
$ sudo setcap cap_setuid,cap_setgid+ep /usr/java/latest/bin/java
另请注意,java 可执行文件所在的文件系统未使用“ nosuid ”选项挂载。
回到你原来的问题
Web 应用程序需要以 www 而不是 root 身份运行
通常,让 Web 服务具有 setuid 功能并不是一个好主意。最好将 uid 放在启动 Web 应用程序的 shell 包装脚本中。