如何在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");