如何在 Java 中发现具有管理员权限的 linux 用户名

How to discover linux username with administrator privileges in Java

我创建了一个需要管理员权限才能执行的程序(在这个程序中我使用的端口是<1024)。
所以我使用这个命令来执行:

sudo java -jar example.jar

在我的程序中,我尝试在这个路径中创建一个文件夹:

Paths.get("/home/" + System.getProperty("user.name"))

问题是 System.getProperty("user.name") 用 "root" 回答,所以我的新目录在“/home/root/”,但我想要它在“ /home/my_username".
我的问题是:如何找到我的用户名,然后在正确的路径中创建新文件夹?

您可以从

Paths.get("/home/" + System.getProperty("user.name"))

user.homeSystem Property

Paths.get(System.getProperty("user.home"))

如果你这样做

sudo whoami

它响应

root

但是如果我这样做

sudo bash -c 'echo $SUDO_USER'

我明白了

peter

您从 Java 开始使用

String user = System.getenv("SUDO_USER");
if (user == null)
    user = System.getProperty("user.name");

Linux 用户名通常在 login(1) 时绑定到 USER 环境变量。最好的方法是使用这个变量,因为其他方法(例如 运行 who(1)id(1) 命令)都会检查它(使用 uid 作为参数,以扫描文件)。这同样适用于 HOMESHELL 变量。所有这些都由 login(1) 在对用户进行身份验证时收集(或由 PAM 库收集),并通过环境传播到所有派生进程。

奇怪的是,您可以将多个用户名绑定到同一个 uid,不使用环境会导致您得到错误的答案(如果您扫描 /etc/passwd 文件你的 uid 作为参数,你可以获得不同的 passwd(5) 文件条目 --- 当然,使用相同的 did) 使用:

String username = System.getEnv("USER");

为了它。

另一方面,如果您创建了一个新会话(使用 sudo(1) 命令或类似命令)并切换了 uideuid 并且环境已更改(重新初始化) ,您如何将其与 root 帐户进行的正确登录区分开来。在那种情况下,没有痕迹表明该进程是由非根用户调用的。