如何在 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.home
System 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
作为参数,以扫描文件)。这同样适用于 HOME
和 SHELL
变量。所有这些都由 login(1)
在对用户进行身份验证时收集(或由 PAM 库收集),并通过环境传播到所有派生进程。
奇怪的是,您可以将多个用户名绑定到同一个 uid
,不使用环境会导致您得到错误的答案(如果您扫描 /etc/passwd
文件你的 uid
作为参数,你可以获得不同的 passwd(5)
文件条目 --- 当然,使用相同的 did
) 使用:
String username = System.getEnv("USER");
为了它。
另一方面,如果您创建了一个新会话(使用 sudo(1)
命令或类似命令)并切换了 uid
和 euid
并且环境已更改(重新初始化) ,您如何将其与 root
帐户进行的正确登录区分开来。在那种情况下,没有痕迹表明该进程是由非根用户调用的。
我创建了一个需要管理员权限才能执行的程序(在这个程序中我使用的端口是<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.home
System 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
作为参数,以扫描文件)。这同样适用于 HOME
和 SHELL
变量。所有这些都由 login(1)
在对用户进行身份验证时收集(或由 PAM 库收集),并通过环境传播到所有派生进程。
奇怪的是,您可以将多个用户名绑定到同一个 uid
,不使用环境会导致您得到错误的答案(如果您扫描 /etc/passwd
文件你的 uid
作为参数,你可以获得不同的 passwd(5)
文件条目 --- 当然,使用相同的 did
) 使用:
String username = System.getEnv("USER");
为了它。
另一方面,如果您创建了一个新会话(使用 sudo(1)
命令或类似命令)并切换了 uid
和 euid
并且环境已更改(重新初始化) ,您如何将其与 root
帐户进行的正确登录区分开来。在那种情况下,没有痕迹表明该进程是由非根用户调用的。