在Linux机器上,有没有一种使用Java获取用户UID的方法?

19

有没有一种方法在Linux机器上使用Java获取用户UID?我知道 System.getProperty("user.name"); 方法,但它只返回用户名,而我需要UID。

6个回答

13

您可以执行id命令并读取结果。

例如:

$ id -u jigar

输出:

1000

您可以通过执行命令来实现。

try {
    String userName = System.getProperty("user.name");
    String command = "id -u "+userName;
    Process child = Runtime.getRuntime().exec(command);

    // Get the input stream and read from it
    InputStream in = child.getInputStream();
    int c;
    while ((c = in.read()) != -1) {
        process((char)c);
    }
    in.close();
} catch (IOException e) {
}

源代码


如果你执行"id -n",解析将会更容易。 - Bill Lynch
2
"id -u <user>" 只会打印 UID。 - dogbane
OP已经从System.getProperty("user.name")获取了用户名。 - dogbane
@Anto,有很多可以玩弄的可能性。 - jmj

11

实际上有一个 API 可以做到这一点。不需要调用 shell 命令或使用 JNI,只需

def uid = new com.sun.security.auth.module.UnixSystem().getUid()

这似乎是针对Oracle特定的,不适用于OpenJDK。 - Graham
1
也适用于OpenJDK,在java-11-openjdk-devel-11.0.3.7上进行了测试。 - Erik Martino
在Mac和Linux上,我对Solaris持怀疑态度。 - Erik Martino
然而,在Java 8中不是一个选项。 - Matthias

6
如果您可以影响Java虚拟机的启动方式,您可以将uid作为用户属性传递:
java -Duserid=$(id -u) CoolApp

在你的CoolApp中,你可以通过以下方式简单获取ID:
System.getProperty("userid");

敬礼,

马丁。


2

另一个选择是使用JNI调用getuid()。


2

为了完整起见,这里提供一个仅使用Java的解决方案,无需任何JNI、子进程或私有API。

警告:这依赖于用户主目录,而不需要与当前运行的Java进程所有者匹配。在盲目依赖此功能之前,请确保您的目标系统环境:

Path userHome = Paths.get(System.getProperty("user.home"));
int uid = (Integer)Files.getAttribute(userHome, "unix:uid")

1
在某些系统上(例如Linux),(Integer)Files.getAttribute(Paths.get("/proc/self"), "unix:uid") 可以用于获取正在运行的进程的UID。 - user3076105

1

只需打开/etc/passwd文件,搜索具有用户等于System.getProperty("user.name")的行。


2
该程序无法在使用其他方法(如NISLDAP等)来维护用户数据库的系统上运行(通常用于集群)。 - Andre Holzner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接