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

如何在Java中发现具有管理员权限的linux用户名,java,linux,sudo,Java,Linux,Sudo,我创建了一个需要管理员权限才能执行的程序(在这个程序中,我使用的端口是您可以从 Paths.get("/home/" + System.getProperty("user.name")) 给用户.home像 如果你这样做 sudo whoami 它的反应是 root 然而,如果我这样做 sudo bash -c 'echo $SUDO_USER' 我明白了 您可以通过Java和 String user = System.getenv("SUDO_USER"); if (user == n

我创建了一个需要管理员权限才能执行的程序(在这个程序中,我使用的端口是您可以从

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

如果你这样做

sudo whoami
它的反应是

root
然而,如果我这样做

sudo bash -c 'echo $SUDO_USER'
我明白了

您可以通过Java和

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

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

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

为了它


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

@stamina root用户的主文件夹是
/root
。是的,但是如果我的用户名是user1,并且在执行程序时使用sudo,我希望在中创建新文件夹/home/user1而不是/root/
我的问题是:有没有办法“发现”我的原始用户名?
root
sudo bash -c 'echo $SUDO_USER'
peter
String user = System.getenv("SUDO_USER");
if (user == null)
    user = System.getProperty("user.name");
String username = System.getEnv("USER");