3

我发现在我的 OSX 系统上我有“奇怪”的设置。Java 将我的用户名读取为“root”,而不是我的实际用户名。结果我使用的代码使用 System.getPropery("user.name") 调用。因此,我制作了独立的片段(我将其保存在 test.java 下),它打印 java 系统 user.name 属性和我的 UNIX 用户名环境:

class UserName {
public static void main(String[] args) {
   String name;
   name = System.getProperty("user.name");
   System.out.println("user.name="+name);
   name = System.getenv("USER");
   System.out.println("USER="+name);
}
}

如果我将它编译为javac test.java然后将它(在我的帐户下,而不是 root 帐户下)作为java UserName运行,它会打印以下内容:

user.name=root
USER=vk

我的问题是 java 在哪里/如何设置 user.name 以及为什么将它设置为 root 而不是我的实际 UNIX 名称。我不是 Java 专家,也不真正了解 System.getProperty API 的内部结构。

第二个问题是可以在 UNIX 环境中以某种方式更改此设置,以使其正确读取我的用户名。

最后可能是我的环境或java配置被破坏,并且有一些隐藏文件(属性)应该被修复。

4

3 回答 3

3

通过关闭 java 可执行文件中的 setuid 位解决了该问题。感谢大卫康拉德的正确提示。供参考:

ls -l /usr/bin/java
-rwsr-xr-x ... /usr/bin/java
sudo chmod -s /usr/bin/java
lrwxr-xr-x ... /usr/bin/java

之后,一切都得到了正确的报告。

于 2014-05-21T23:14:09.210 回答
2

您正在使用 sudo 或在运行su命令并成为 root 之后运行 java。(也许 MacOS 默认以 root 身份运行您的命令,因为您的用户位于管理员组中)。

su在 Linux (CentOS) 上以 root 权限运行命令后也会获得相同的输出。

user.name=root
USER=jdiver
于 2014-05-21T21:01:12.937 回答
0

Java 会user.name从操作系统获取属性,所以如果你不是以 root 身份运行或使用sudo来启动 java,那么 java 可执行文件必须是 setuid root。

您可以通过以下方式检查:

$ ls -l /path/to/java

如果 java 是 setuid root,您将看到如下内容:

-rwsr-xr-x 1 root root 123456 Apr 1 16:59 /path/to/java

用户执行位中的“s”表示它是一个 setuid 程序。您可以使用以下命令删除 setuid 位:

$ sudo chmod -s /path/to/java

于 2014-05-22T16:05:44.413 回答