Java system.getProperty问题

时间:2014-05-21 20:45:10

标签: java macos getproperty

我发现在我的OSX系统上,我有一个很奇怪的"建立。 Java将我的用户名读作" root"而不是我的实际用户名。原来我使用的代码使用System.getPropery(" user.name")调用。所以,我编写了独立剪切(我将它保存在test.java下),它打印了java system 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配置被破坏,并且有一些应该修复的隐藏文件(属性)。

3 个答案:

答案 0 :(得分: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

之后,所有事情都得到了妥善报道。

答案 1 :(得分:2)

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

在具有root权限的su命令之后运行时,在Linux(CentOS)上也可以获得相同的输出。

user.name=root
USER=jdiver

答案 2 :(得分: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